VBAコード実行でエラーが発生する

このQ&Aのポイント
  • この質問は、VBAコードがうまく実行されず、エラーが発生していることに関するものです。
  • 提供されたコードの3行目でエラーが発生しています。
  • 質問者は、約40行のデータ全体に対してコードを実行したいと考えていますが、うまくいっていません。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

補足を読みましたがますますもって意味が不明になっています。 1で示したサンプルの範囲(E65536)、offcetの数字を適当に変えるだけでよいのに、なぜさらにCallで呼び出してForEachで二重化しようと考えられたのかが分かりません。 根本的にForEach内でどのような動作がされているのかが理解されていないようですので、デバッグモードで一行ずつ処理を目で追ってみたらどうでしょう。 もっと単純にして説明すると、 下記のコードだと For Each r In Range("A1", "E2") r.Value = r.Address Next r 1週目はA1のセルに"A1"が入力され、2週目はB1のセルに"B1"、3週目は...と最後のE2までループされます。 まずここの動作を理解したうえで、その次のステップに進みましょう。 1.値を比較する(IF文)、色を変える(ColorIndex) 2.範囲を動的に指定する(End(xlUp))、セルを塗り替える場所を相対的に指定する(offcet) ただしそれ以前に特定セルの値の条件によって、どこかのセルの色を変えるだけなら、条件付書式を使えばよいと思うのですが、それではダメなんでしょうか? 簡単にできることを敢えて難しくやる必要はないでしょう。

oshietecho-dai
質問者

お礼

どうも有難うございました。 1行ごとにしか、実行されないものと思っておりました。 大変、申し訳ございませんでした。

その他の回答 (1)

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

どこがおかしいかは一発で分かりましたが(●の部分が抜けている)、 If r.Offset(0, 1).Resize(●, r.Offset(0, 1).Range("IV40").End(xlToLeft)).Cells.Value >= 3 Then 構文自体が成立していないため、適当な数値を入れたところで動かないかと思います。 意図は何となく理解できないこともないですが、ForEachで個別にRangeを取り出しておいて、resizeをするのがおかしいですし(そもそも値の比較は個々のセルと特定の値同士でないと成立しません)、offsetの使い方もおそらく一つずつ順番に比較するというようなことを意図しているのではと想像しますが、それはFor Eachの方で指定します。 もの凄く単純に、A1~E?までの各セルの値が3以上なら10個下のセルを赤にするだけなら下記のような感じになります。これを修正すれば意図に近いものができそうな気もします。 ----- With Worksheets(Worksheets.Count) For Each r In .Range("A1", .Range("E65536").End(xlUp)) If r.Cells.Value >= 3 Then r.Offset(10, 0).Interior.ColorIndex = 3 '赤に塗りつぶす End If Next r End With ----- ただしこの程度のことなら条件付書式だけでかまわないような気がします。

oshietecho-dai
質問者

補足

ご回答、誠に有難うございます。 よく解りませんが、下記(正常に動作しません)のように、Call すればよいのでしょうか? つなげかたも、うまくできません。 よろしくお願い致します。 Sub 数値3以上なら下方セルを赤色にする() Dim r As Range   With Worksheets(Worksheets.Count)   For Each r In .Range("A40", .Range("A65536").End(xlUp))    Call 赤に塗りつぶす   Next r   End With End Sub '------------- Sub 赤に塗りつぶす() Dim r As Range  For Each r In Worksheets(Worksheets.Count).Range(Selection, Selection.Offset(0, 8))   If r.Value >= 3 Then    r.Offset(38, 0).Interior.ColorIndex = 3 '赤に塗りつぶす   End If  Next r End Sub

関連するQ&A

  • このコード(For Each…)ですが、うまく実行できません!

    EXEL 2002 です。 下記コードなのですが、 うまくできません、 「For Each…」の下2行がエラーとなります。 何卒、ご教示よろしくお願い致します。 -------------------- Sub 下方表の各列を上方へ貼付る() '下方の表の各列を、上方に貼り付ける Dim r As Range With Worksheets(Worksheets.Count - 1) For Each r In .Range("G40:Z40") .Range(r.Offset(0, 0), .Range(r.Offset(0, 0)).End(xlDown)).Copy _ .Range (r.Offset(-38, 1)) Next r End With End Sub

  • 一部のコード編集が解りません(複数の列を昇順に並び替える)

    「複数の列を行方向へ昇順に並び替える」のマクロです。 「>」の行部分が「コンパイルエラー  構文エラー」となります。 編集(下記)しようとしてるんですが、どうしてもうまく行きません。 ご教示くださいませ。 下記例は、3行目が項目(B3以降)、B3列以降に複数列あります。 縦に、最後行が320行以下(変動あり、空白あり)に数字データがあります。  A    B    C    D     E・・・  1 2 3     赤    赤    赤    赤 ・・・ 4    275.9  5651.2   7494.6    319.2・・・ 5    78.7   764.3    4188.2    283.7・・・ 6    695    935.6    8718.1   1736.8・・・ 7      ・     ・     ・     ・ 8      ・     ・     ・     ・  ・ ・ -------------- Sub Test() Dim r As Range With Worksheets(Worksheets.Count) >For Each r In .Range("B3", .Range("IV3").End(xlToLeft) r.Offset(1, 0).Resize(320, 1).Sort key1:=r.Offset(1, 0), _ Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _ Orientation:=xlTopToBottom 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

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

    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

  • 表内の斜め左半分を選択するマクロコードがわかりません?

    Windows XP Home Edition Excel 2002 表内の緑色の斜め左下半分(緑色)だけをB8の右へ順次貼り付けたいのですが、うまく動作してくれません。 番号行(グレー色)は、各シートによって違ってきます。 各シートの表は、必ず、当表のように対角線状だけ空白セルになっております。 ほんとは、表内の緑色のデータだけを選択さえできればいいのですが、自分の能力では、  当質問内容の方法しか考えつきませんでした。 何卒、ご教授お願い致します。 Sub 斜め左半分を選択() Dim r As Range  With ActiveSheet  For Each r In .Range("A4", .Range("A4").End(xlDown))   Range(r.Offset(0, 1), .r.End(xlToRight)).Copy _   Destination:=r.End(xlDown).Offset(1, 1).End(xlToRight).Offset(0, 1)  Next r  End With End Sub

  • このコードの修正点はありますか?

    Private Sub Clear() With Worksheets("abc") With .Range("A2", .Range("A" & Rows.Count).End(xlUp)) If .Row = 2 Then .EntireRow.Resize(, 7).ClearContents End If End With End With End Sub シートabcの、A2から最終行まで取得。 A2からA15までデータがあれば、それらの行のG列までクリア。 というコードですが、 If .Row = 2 Thenというのは、2行ならという意味ではないのですか? 1行でもデータがあればクリアにしてもらいたいのですが、 If .Row > 0 Thenみたいな感じにならないのでしょうか? 教えていただいたコードですが、この部分がわからないです。 ご教授くださいませ。

  • 「 0 」 を除いて ( 無視して ) ソートするには?

    データに「0」があることが原因だと思うのですが! データに「0」がある行だけだと思いますが、「0」が頭に集まったり、 データ途中に連続に混入したりして、きちんとソートできません。 いろいろ試しているんですが、うまく出来ません。 どおしても、「0」が邪魔になります。 「0」を非表示にしても、フォント色が白になるだけで、どおしても「0」は削除できません。 置換えで「0」を削除するしかないのでしょうか? 良い方法がおありでしたら、何卒ご教授くださいませ。 --------- Private Sub 昇順に並び替え() Dim r As Range With Worksheets(Worksheets.Count) For Each r In .Range("A2", .Range("A65536").End(xlUp)) r.Offset(0, 1).Resize(, 255).Sort Key1:=r.Offset(0, 1), _ Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _ Orientation:=xlLeftToRight Next r End With End Sub

  • 印刷後のVBAの実行 (3)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします

  • このVBAコードの解説をお願いします。

    特定の行の中で同じものが続いたらセルを結合する、ということがやりたくて 以下のコードをネット上から探してきました。 上記の動作は実現できたのですが、自分でこのコードをみてもイマイチわかりません。 お分かりになる方、できれば1行ずつ解説してください。 よろしくお願いします。 Sub Sample() Dim myRng As Range, myRow As Long Set myRng = Range("A1") For myRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(myRow, 1) If .Value = .Offset(1).Value Then Set myRng = Union(myRng, .Offset(1)) Else Application.DisplayAlerts = False myRng.Merge Application.DisplayAlerts = True Set myRng = .Offset(1) End If End With Next End Sub

  • 保護されているシートでマクロ実行するとエラー

    Excel2010で勤務表を作っています。 A列にとある文字列(承認)と入力すると、その行が保護されるマクロを、下記URLからコピペして使わせて頂いてます。 http://questionbox.jp.msn.com/qa3277541.html 勤務表なので、土日祝日は網掛けになるよう条件付き書式を使っています。 休暇取得した場合は網掛けを付けて、休日出勤した場合には網掛けなしにしたり出来るようマクロをマクロの自動記録で作りました。 ところが、どこかの行が保護されている状態で、セルの網掛けを変更するマクロを実行すると 「実行時エラー'1004'アプリケーション定義またはオブジェクトの定義エラーです」と出てしまいます。 保護されている行ではなく、まだ保護はされていない行に実行しています。 エラーが出ているのは網掛けマクロから出ています。 以下、今エクセルファイルにあるマクロの構文になります。 網掛けマクロは全部で4つ作りました。 1)休日出勤した際に条件付き書式をクリアして網掛けなしにするマクロです。 Sub 休日出勤() ' 条件書式クリア Selection.FormatConditions.Delete End Sub ※エラーになっている部分です。 2)平日休んだ日に網掛けをするマクロです。 Sub 休日() ' 網掛け With Selection.Interior .ColorIndex = 0 .Pattern = xlGray16 .PatternColorIndex = xlAutomatic End With End Sub 3)2)のマクロで休日にしたけど、やっぱり出勤したという時に、1)だと網掛けなしにならなかったので、網掛けなしにするマクロを作りました。 Sub網掛けなし() ' 網掛けなし With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub 4)ごちゃごちゃいじってしまって最初の状態に戻したいと思ったので条件付き書式を再設定するマクロを作りました。が、2)の休日マクロを実行したセルは元に戻らないので仕方なく3)の網掛けなしマクロを実行しなければなりません。 Sub 書式クリア() ' 条件書式再設定 Range("A6:K36").Select Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=WEEKDAY($B6,2)>=6" Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority With Selection.FormatConditions(1).Interior .Pattern = xlGray16 .PatternColorIndex = xlAutomatic .ColorIndex = xlAutomatic End With Selection.FormatConditions(1).StopIfTrue = False Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=OR(WEEKDAY($B6)=1,COUNTIF(祝日,$B6))" Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority With Selection.FormatConditions(1).Interior .Pattern = xlGray16 .PatternColorIndex = xlAutomatic .ColorIndex = xlAutomatic End With Selection.FormatConditions(1).StopIfTrue = False End Sub ※この中のSelection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=WEEKDAY($B6,2)>=6"の部分がエラーと出ています。 ※1)から3)は網掛けしたいところ、網掛けなしにしたいところを範囲選択してから実行しなければなりません。 その他、保護を解除する際にパスワード認証が欲しかったので、「保護解除」ボタンを押すためにパスワード認証させるマクロもあります。 これは特に問題なく動いています。 5)パスワード認証つき保護解除マクロ Sub password() Dim pw As Long pw = Application.InputBox( _ prompt:="パスワード入力", Type:=1) If pw <> "123" Then MsgBox "パスワードが違います" Exit Sub Else MsgBox "保護解除しました" ActiveSheet.Unprotect End If End Sub 6)行ごとに保護するマクロです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r, rng As Range Set rng = Intersect(Target, Columns(1)) If Not rng Is Nothing Then If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If For Each r In rng If r.Value = "承認" Then r.EntireRow.Locked = True Else r.EntireRow.Locked = False End If Next r ActiveSheet.Protect DrawingObjects:=True, Contents:=True End If End Sub マクロに関してはド素人で、自動記録かWebで調べて見つけたマクロをちょっと加工して使う程度です。 どうか知恵をお貸しください。よろしくお願いします。

専門家に質問してみよう