• ベストアンサー

コードへ追記したら、特定のシートしか実行できません!

Windows XP Home Edition Excel 2002 http://oshiete1.goo.ne.jp/qa4952620.html​ 以前に、ご教授頂いたコードに少し追記して、しばらく問題なく使用していましたが、 本日、同ブックの他のシートで実行しましたら、無反応で、セルに色が付きません(エラーではありません)。 何度も行ってみましたが同じ結果です。 但し、'★部分「Offset(-1, 0)」の2箇所を削除して実行するとセルに色が付き、問題なく実行できます。 ちなみに、実行できないシートは、1行全部にオートフィルタ(▼)がかかってしまいます。 私は、いつもEntireRowにてオートフィルタ(▼)をかけております。 しかし、10列ぐらいだけにオートフィルタ(▼)をかけて、実行しても結果は、無反応で、セルに色が付きません。 問題なく実行できるシートでは、EntireRowにてオートフィルタ(▼)をかけても、データのある列までしか オートフィルタ(▼)がかかりません。 このコードは、どんなシートでも実行できると思っていたのですが、 特定のシートでしか実行できないのでしょうか? 原因がわかりません。 よろしくお願い致します。 ------------ 'SheetModule Option Explicit Sub Worksheet_Calculate()   Static r As Range   Dim f As Filter   Dim i As Long   On Error GoTo errHndler   With ActiveSheet    If .AutoFilterMode Then      With .AutoFilter         If r Is Nothing Then Set r = .Range.Rows(1)         For Each f In .Filters           i = i + 1                 '★           r.Cells(i).Offset(-1, 0).Interior.ColorIndex = IIf(f.On, 33, xlNone)         '33()が、識別用 ColorIndex。任意で。         Next f       End With      Else                     '★       If Not r Is Nothing Then r.Offset(-1, 0).Interior.ColorIndex = xlNone       Set r = Nothing      End If   End With errHndler:  If Err.Number <> 0 Then MsgBox Err.Number & ":" & Err.Description End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#2の回答者です。 自分のレスを読み直し、元のご質問を読み直してみましたが、読み勘違いがあったかもしれません。ご質問には詳しく書かれていない部分があるようです。 少し、ややこしいので、文章ではうまく伝えられないかもしれませんが、分からなければ、一旦、マクロを試してからお聞きなってください。 ------------------------------------------- (1) >いつもEntireRowにてオートフィルタ(▼)をかけております。 ひとつの問題は、ここにあります。VBAで行う場合は、通常は、#2で書いたように、Range("A1").CurrentRegion で、範囲を取得するのが一般的です。 つまり、マトリックス(縦横の列)の「左上端のセル」の部分を設定することです。しかし、AutoFilter は、上記では、その「左上端のセル」を、一般的なコードでは探すことが出来ません。ここに人間が介在してあげるのが普通です。 私は、EntireRowではしたことがありません。論理的には可能なはずですが、AutoFilter には、データのある部分を探すという機能が含まれているようですが、何かの作用で取得できないときに、全一行を取得してしまうようです。 誤動作が予想される場合は、Endプロパティで丁寧に、必要な範囲を取得するしかないようです。 *その範囲を取得するコードは、Endプロパティの右から左の方法、左から右への方法など、状況にもよるので、汎用性のあるコードは書けません。 (2) またコードにある、.Range.Rows(1)のひとつの単位は、Cells(1) ですが、.Offset(-1, 0) このRange の範囲は、AutoFilter のRange です。もちろん、Offcet(-1,0) で、その上のセルを探すことは可能ですが、それは、物理行の存在がある場合に限るような気がします。エラーが出ないとすると、論理行を指しているかもしれませんが、こちらではエラーが発生します。 訂正: Sub Worksheet_Calculate() Static rng As Range   Dim i As Long   Dim j As Long   If ActiveSheet.AutoFilterMode Then     With ActiveSheet.AutoFilter       If .Range.Rows(1).Row = 1 Then 'タイトル行が1行目の場合         j = 0       Else         j = -1       End If       For i = 1 To .Range.Rows(1).Cells.Count         If .Filters(i).On Then           .Range.Rows(1).Offset(j, i - 1).Interior.ColorIndex = 33         Else           .Range.Rows(1).Offset(j, i - 1).Interior.ColorIndex = xlNone         End If       Next i       Set rng = .Range     End With   Else     If Not rng Is Nothing Then 'リセット(ただしできないことがある)       rng.Rows(1).Offset(j).Interior.ColorIndex = xlNone     End If     Set rng = Nothing   End If End Sub

oshietecho-dai
質問者

お礼

こんばんは。 そもそも、私は、基本的な(箇所等への)オートフィルタの掛け方ではなかったようです。 また、Offset(-1, 0)の追記は全くの軽率でした。 でも、御回答のコードは、私のような者へもorどんな箇所へも対応してしまうんですね!! 私の質問内容の不足分まで、先読みし見抜いて頂きまして。 新たなコードを、ご丁寧に、誠に有難うございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 元の元は私のコードのようのようですが、だいぶ、違う内容のようです。 これで、On Error Goto errHndler  r.Cells(i).Offset(-1, 0) では、最後に飛んでしまいます。 Offset(-1,0) では、セルのないところを選ぼうとしているので、うまくありません。 その場合は、本来は、On Error Resume Next ~ On Error Goto 0 で挟んでやることですが、このようにして出来るのではないかと思います。 また、 >問題なく実行できるシートでは、EntireRowにてオートフィルタ(▼)をかけても、データのある列までしかオートフィルタ(▼)がかかりません。 これは、VBAとはまったく関係のないものです。 任意の範囲にAutoFilter を掛けたいのでしたら、最初に範囲を選択してから、AutoFilter 掛けてください。AutoFilterの自動的な範囲は、VBAとしては、CurrentRegion と同じ意味です。 '------------------------------------------- 'シートモジュール Sub Worksheet_Calculate() Static rng As Range   Dim i As Long   If ActiveSheet.AutoFilterMode Then     With ActiveSheet.AutoFilter       For i = 1 To .Range.Rows(1).Cells.Count         If .Filters(i).On Then           .Range.Rows(1).Cells(i).Interior.ColorIndex = 33         Else           .Range.Rows(1).Cells(i).Interior.ColorIndex = xlNone         End If       Next i       Set rng = .Range     End With   Else     If Not rng Is Nothing Then       rng.Rows(1).Interior.ColorIndex = xlNone     End If     Set rng = Nothing   End If End Sub

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

>コードへ追記したら、特定のシートしか実行できません! ご自分でコードを変更したのでは? 解決方法は簡単でしょ リンク先のコードをコピペすれば解決 >このコードは、どんなシートでも実行できると思っていたのですが、 >特定のシートでしか実行できないのでしょうか? 出来ますよ でも、コードの追加によって、一つ条件が付いてますけどね >原因がわかりません。 原因は追加したコードです 以上参考まで

oshietecho-dai
質問者

お礼

こんばんは。 >原因は追加したコードです おっしゃられるとおりでした。 私の質問コード自体にOffset(-1, 0)の追記は全くの軽率でした。 この追記は、何か変だなと思っていたのですが・・・ ご回答、誠に有難うございました。

oshietecho-dai
質問者

補足

早速のご回答、誠に有難うございます。 当方は、Cells(i)の1つ上のセルに実行したいものですから、 現在、いろいろと試しております。 当方にとっては、時間がかかりそうなので、再度、投稿致致します。 申し訳ありません。

関連するQ&A

  • 調子よく使用していたコードが、急にエラーに!

    Windows XP Home Edition Excel 2002 つい最近、ご回答して頂いたコードです。 オートフィルタ(▼)がかかった、直上のセルに色を付けるために使用しておりました。 どの行でも、どこでも実行できておりました。 大変、調子がよく使用していたのですが、 本日、下記のようにエラーとなり、動作しなくなってしまいました。 原因の一つは、 当方が、 EntireRowにてオートフィルタ(▼)をかけた場合に、 1、 256列全てにオートフィルタ(▼)がかかる。 2、 Range("A1").CurrentRegionのようにデータがある列までオートフィルタ(▼)がかかる。 のように、2通りの結果となります。 1の時にエラーとなるようです。 Range("A1").CurrentRegion にてオートフィルタ(▼)をかけた場合は、 下記コードはきちんと動作します。 1となってしまうのは、当方の、ブックに何か原因があるのでしょうか。 1の場合でも動作させることはできますでしょうか。 当方のデータシートは、データがとんでいる所がありますので、 Range("A1").CurrentRegionでうまくオートフィルタ(▼)がかからない場合があります。 下記★箇所がエラーとなります。 一般的ではない質問かと思いますが、 何卒、ご教示お願い致します。 '------------------------------- 実行時エラー'424' オブジェクトが必要です。 と表示されます。 '------------------------------- Sub Worksheet_Calculate() Static rng As Range   Dim i As Long   Dim j As Long   If ActiveSheet.AutoFilterMode Then     With ActiveSheet.AutoFilter       If .Range.Rows(1).Row = 1 Then 'タイトル行が1行目の場合         j = 0       Else         j = -1       End If       For i = 1 To .Range.Rows(1).Cells.Count         If .Filters(i).On Then           .Range.Rows(1).Offset(j, i - 1).Interior.ColorIndex = 33         Else           .Range.Rows(1).Offset(j, i - 1).Interior.ColorIndex = xlNone  '★         End If       Next i       Set rng = .Range     End With   Else     If Not rng Is Nothing Then 'リセット(ただしできないことがある)       rng.Rows(1).Offset(j).Interior.ColorIndex = xlNone     End If     Set rng = Nothing   End If End Sub

  • このコードですが、うまく実行できません!

    EXEL 2002 です。 最終シートに 「約40行」 ぐらいのデータがあり、   その各行の列に、 約20個の数値のセルがあり、    その各セルの数値が 3 以上だったら、 「.Offset(38, 0)」セルを赤色にする。 を、全部の 「約40行」 に実行したいと思っております。 下記コードなのですが、 うまくできません、 3行目がエラーとなります。 何卒、ご教示よろしくお願い致します。 ------------------------- Sub 数値3以上なら上方セルを赤色にする() Dim r As Range With Worksheets(Worksheets.Count) For Each r In .Range("A40", .Range("A65536").End(xlUp)) If r.Offset(0, 1).Resize(, r.Offset(0, 1).Range("IV40").End(xlToLeft)).Cells.Value >= 3 Then r.Offset(38, 0).FormatConditions(1).Interior.ColorIndex = 3 '赤に塗りつぶす End If Next r End With End Sub

  • このコードに3行を追記しましたら、動作がだいぶ遅くなってしまった!

    Windows XP Home Edition Service Pack 3 Office XP Personal 2002 Excel 2002 下記コードについて2点お伺いさせて下さいませ。 (1)●の3行を追記しましたら、動作がだいぶ遅くなりましたが、仕方ありませんでしょうか?    記述する順序がいけませんでしょうか? (2)●■が実行されません。 よろしくご教示お願い致します。 Sub TEST() Dim r As Range On Error Resume Next  With Worksheets(Worksheets.Count)  For Each r In .Range(Range("A2").End(xlDown).Offset(3, 2), .Range("A65536").End(xlUp).Offset(0, 25))   If r.Cells.Value >= 2 And r.Cells.Value <> 0 And r.Cells.Value <> "" Then    With r.Offset(-38, 0)     .Font.ColorIndex = 10 '緑色にする     .Interior.ColorIndex = 36 '黄色にする     .Borders.LineStyle = xlContinuous  '●     .Borders.Weight = xlMedium '●太線     .ColorIndex = 5 '●■紺色  '←ここが動作しません    End With   End If  Next r End With

  • シート保護をすると実行エラーになります。

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("A1:A2000")) Is Nothing Then Exit Sub With Selection.Interior If .ColorIndex = xlNone Then .ColorIndex = 4 Else .ColorIndex = xlNone End If End With Cancel = True End Sub A列任意のセルをダブルクリックすると色が変わるコードを組んでいます。しかしながら、 A列のみロックを解除したのち、シート保護をすると、上記の実行がエラーになります。 どのようにすればエラーを回避できるのかお知恵をかしていただければ幸いです。

  • Excel VBA 範囲の条件付け

    現在下記のコードを組んでいます。 やりたい事は、sheet1~3で背景色の赤いセルと、 そのセルの上方の最初の空白セルの下3行をsheet4にコピペする。 【下記コードで実現出来ていないこと】 1.背景色が赤いセルとそのスグ上の3行をコピペしてしまう。 2.同じシートに背景色が赤いセルが複数あっても、1つしかコピペしない。 3.sheet4のコピペ先をA3、A13、A23と仮に指定しているが、  sheet1のコピペ内容に1行空けて、sheet2のコピペ内容、  また1行空けて、sheet3のコピペ内容というセル指定にしたい。 以上、よろしくお願い致します。 Sub Test() Dim i As Long, r As Range With Worksheets("sheet1") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If Next i End With If Not r Is Nothing Then r.Copy Sheets("Sheet4").Select Range("A3").Select ActiveSheet.Paste With Worksheets("sheet2") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If Next i End With If Not r Is Nothing Then r.Copy Sheets("Sheet4").Select Range("A13").Select ActiveSheet.Paste With Worksheets("Sheet3") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If Next i End With If Not r Is Nothing Then r.Copy Sheets("sheet4").Select Range("A23").Select ActiveSheet.Paste End Sub

  • 【マクロ】全シートでまとめて実行するには?

    教えてください。マクロは初心者です。 ↑先ほど、http://oshiete1.goo.ne.jp/qa5695407.html で、ある親切な方に以下のマクロを教えて頂きましたが、私がその時にまとめて聞くのを忘れてしまい、改めて教えていただきたく思います。 ------------------------------------------------ Sub test()  Dim R As Long  For R = 1 To Cells(Rows.Count, "B").End(xlUp).Row    If Cells(R, "B").Value = "土" Or CellsR, "B").Value "日" Then      Cells(R, "A").Resize(1, 5).Interior.ColorIndex = 6    End If  Next R End Sub ---------------------------------------------------- 上記のマクロを1シートでなく、全シートでまとめて実行したいのですが(どのシートも同様の内容なので)、どうすればいいのかわかりません。 どの個所にどんなコードを入れればよいのでしょうか? よろしくお願いします。 【XP、2003】

  • エクセルVBAのイベントで質問です。

    ある範囲のセルの色をダブルクリックにより変えていますが、 下の("D5:D50,F5:F50,K5:K50,M5:M50"))の範囲を例えばSheet1の A2以下に始めの範囲、B2以下に終りの範囲を下に書いていって、 対象とする範囲を可変にしたいのですが、どのようにすれば いいでしょうか。 例えば("D5:D50,F5:F50,K5:K50,M5:M50"))であれば A2に「D5」 B2に「D50」 A3に「F5」 B3に「F50」 などとセルにセル番地をいれておいて、コードを変えなくても シート上で範囲を変えていけるようにできないでしょうか。 やり方があれば教えてください。 よろしくお願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim r As Range Set r = Intersect(Target, Range("D5:D50,F5:F50,K5:K50,M5:M50")) If r Is Nothing Then Exit Sub With r.Interior If .ColorIndex = xlNone Then .ColorIndex = 3 ElseIf .ColorIndex = 3 Then .ColorIndex = 4 ElseIf .ColorIndex = 4 Then .ColorIndex = xlNone End If End With Cancel = True End Sub

  • エクセル:シートを切り替えずに別シート上の操作をする

    タイトルが正しいかどうか疑問ですが。 シート[Sheet1]にて値を入力したアドレス(の行番号と列番号)を取得し、 その周囲のセルの罫線の色を赤(3)から灰色(15)に置換するコードを作っています。 Sheet1のコードには、 Private Sub Worksheet_Change(ByVal Target As Range)  AAA Target End Sub とだけ書き、入力があったらプロシージャAAAへTargetを持って飛びます。 Sub AAA(ByVal Target As Range)  Dim M_Row As Integer  Dim M_Clm As Integer  Dim Y As Range  M_Row = Target.Row  M_Clm = Target.Column  For Each Y In Worksheets("Sheet1").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))   With Y    If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15    If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15    If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15   End With  Next End Sub ここまでは正常に動きます。 この後に、アクティブでないシート[Sheet2]の同じセル範囲にある罫線の色も同じように置換したいので、 上記コードに続けて、以下のように書きました。 Sub AAA(ByVal Target As Range)  Dim M_Row As Integer  Dim M_Clm As Integer  Dim Y As Range  M_Row = Target.Row  M_Clm = Target.Column  For Each Y In Worksheets("Sheet1").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))   With Y    If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15    If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15    If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15   End With  Next  For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))   With Y    If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15    If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15    If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15   End With  Next End Sub これだと、  For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5)) の部分で失敗します。 この1行前に、  Sheets("Sheet2").Select と入れてやると正常に動作するのですが、 シートを切り替えずにやりたいと思っています。 可能でしょうか? 以下のように、 実行後にSheet1に戻し、 それらを Application.ScreenUpdating = False Application.ScreenUpdating = True で挟むことで、見た目はシートを切り替えずに実行できるのですが、 実際にこのコードを組み込んでいるシートはシート上にあるデータが多いためか(600行×100列程度)、 全く同じコードを実行しても一瞬画面がチラついてしまいます。 (新規Bookで同じコードを組み込んで、何行かに罫線を引いただけのシートだと全くチラつかなかったので、 シート上のデータが多いせいじゃないかと思いました) Sub AAA(ByVal Target As Range)  Dim M_Row As Integer  Dim M_Clm As Integer  Dim Y As Range  M_Row = Target.Row  M_Clm = Target.Column  For Each Y In Worksheets("Sheet1").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))   With Y    If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15    If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15    If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15   End With  Next  Application.ScreenUpdating = False  Sheets("Sheet2").Select  For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))   With Y    If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15    If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15    If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15   End With  Next  Sheets("Sheet1").Select  Application.ScreenUpdating = True End Sub よろしくお願いします。

  • このコードが、うまく実行できません!

    下記の実行後のようにしたのですが、うまく出来ません、 何卒、ご教示くださいませ。 EXEL 2002 です。 ------------------------------------ Sub 数に対してマークを付ける() Dim c As Range Workbooks(1)..Sheets(1).AutoFilter.Range.Cells(1, 5).Select For Each c In Range(Selection, Sheets(1).AutoFilter.Range.Cells(1, 5).End(xlDown)).Select Select Case c.Value Case Is = 0 c.Offset(0, -3).Value = "×" Case Is = 1 c.Offset(0, -3).Value = "△" Case Is = 2 c.Offset(0, -3).Value = "○" Case Else MsgBox "対象の数字がありません" End Select Next End Sub --実行前-------------------  A B C D E F G H 1 ・ ・ ・▼▼▼▼▼▼▼▼←オートフィルターのマーク ・       0 ・       2  ・       1 ・       0 50 ・ --実行後------------------  A B C D E F G H 1 ・ ・   ・▼▼▼▼▼▼▼▼←オートフィルターのマーク ・  ×    0 ・  ○    2  ・  △    1 ・  ×    0 50 ・ ---------- よろしくお願い致します。

  • シート全体対象の設定方法と複数のセル範囲の参照方法

    ブック名「全体.xls」の全シート対象に、 (A1:B10) (D1:F10)の範囲だけの数値を調べ、 その数値が50以上のときに背景色を赤色にするマクロを作りたいですが。 Sub セルの値が50以上の時、背景色を赤色にする() Dim i As Integer i = ActiveCell.Value With ThisWorkbook("全体").Range("A1,B10") If i >= 50 Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.ColorIndex = xlNone End If End With With ThisWorkbook("全体").Range("C1,F10") If i >= 50 Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.ColorIndex = xlNone End If End With End Sub こうしても、 With ThisWorkbook("全体").Range("A1,B10") のところでエラーではじかれます。シート全体の("A1,B10")を対象にしたいですが、指定方法が分かりません。 ちなみにシート数は追加・削除あるので一定ではないです。 また、("A1,B10")と("C1,F10")にて個別にコードを書くのではなく 同時に設定したいけれど、(.Range("A1,B10")&("C1,F10")みたいな) やり方を知りたいです。 初歩的な質問で申し訳ありません。よろしくお願いします。

専門家に質問してみよう