• ベストアンサー

EXCEL VBA のFor~Next文で質問です。

お世話になります。VBA初心者です。 環境はWIN2000,EXCEL2000です。 下記のようなマクロを組んだらNextに対するForがありませんと、エラーが出てしまいました。 申し訳ありませんが、手直しお願いします。 やりたいことは、D97へコピーが終わったら、次はM7からコピーをし、M97へのコピーが終わったらV7からコピーを始めたいのです。 With sheetGR For ii = 7 To 97 Step 10(行の指定) For iii = 4 To 31 Step 9(列の指定) If .Cells(ii, iii) = "" Then .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _ = Sheets("Result").Range("G20:I24").Value End If Exit For If Cells(97, iii) <> "" Then Next iii End If Next ii End With

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.3

For To Step Exit For Next で一組になります。 If文内でNextの設定はできません。 この場合は下記の様になるのではないですか? With sheetGR For ii = 7 To 97 Step 10(行の指定) For iii = 4 To 31 Step 9(列の指定) If .Cells(ii, iii) = "" Then .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _ = Sheets("Result").Range("G20:I24").Value End If If Cells(97, iii) = "" Then Exit For Next iii Next ii End With

その他の回答 (3)

noname#148473
noname#148473
回答No.4

コードを一通り拝見したのですが、どうも処理の意図が読めません。特に不可解なのが、1つめのIf文の後にある「Exit For」です。ここにExit Forを置いておくと、If文の結果に関係なく、「For iii = 4 To 31 Step 9」のループはiii=4で1回実行されただけで終わってしまいます(つまりFor文にしている意味がない) また、ご質問の「Nextに対するForがありません」というエラーは、2つ目のIf文の中に「Next」を容れていることが原因です。Forは必ずNextと対になっている必要がありますので、条件式次第では実行されないIf文の中にNextを置くことはできません。条件によってはForループから抜け出したいという場合には、先ほどの「Exit For」を使います。 手直しをご要望でしたら、どういった処理を行いたいのか、もう少し詳しく書いていただければ対応できると思います。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 >Nextに対するForがありませんと、エラーが出てしまいました。 まさに、エラーメッセージの通り、変数iiiのループのNextがないということです。 Next iii というコードを、 Next ii の手前に追加しましょう。

nanami0310
質問者

お礼

ありがとうございます。 やってみましたが、どうしてもエラーが出ました。 「If Cells(97, iii) <> "" Then Next iii」という部分が間違っているようです。 ありがとうございました。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

よく検証していないのではずしていたらごめんなさい。 単に「空欄だったらコピーする」を繰り返すのなら 単純に繰り返すだけでいいはずです。 With sheetGR  For ii = 7 To 97 Step 10(行の指定)   For iii = 4 To 31 Step 9(列の指定)    If .Cells(ii, iii) = "" Then     .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _     = Sheets("Result").Range("G20:I24").Value    End If   Next iii  Next ii End With こんな感じ。 (見やすくするために全角空白を使って字下げしているので、コピー&ペーストしただけではエラーが出るかもしれません。)

nanami0310
質問者

お礼

ありがとうございます。 「D97にコピーし終わったら次の列へ行きたい」という形にしたいので、「If Cells(97, iii) <> "" Then Next iii」という部分は外せないんです。 ごめんなさい、ありがとうございました。

関連するQ&A

  • EXCEL VBAで、途中で処理が終わってしまいます。

    お世話になります。No.843313の続きになるのですが、思った通りに動いてくれませんでした。 やりたいことは、「Cells(97,4)まで数字が入ったら、次はCells(7,13)に移動して処理1を繰返したい」というものなのですが、Cells(97,4)まで入ったところで終了してしまい、次のCells(7,13)へ移動してくれません。エラーメッセージも出ていません。 どうしたらいいのでしょうか?宜しくお願いします。 (見やすいように字下げできませんでした。見難くてごめんなさい。) iii = 4 With sheetIRO ’処理1  For ii = 7 To 97 Step 10    If .Cells(ii, iii).Value = "" Then    .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _    = Sheets("Result").Range("G20:I24").Value   Exit For  End If If ii = 97 Then   iii = iii + 9   ii = 7   Exit Sub End If Next ii End With

  • VBA For~Next

    こんにちは 上手く 説明できるか心配なのですが 下記のテスト1ですと 36行毎に Targetが A4,A40,A76,A112だと A1,A437,A73,A109.Value = "" Then ComboBox3.DropDownさせてから ComboBox4.DropDownさせてますが A1,A437,A73,A109にValue が入っていると A4,A40,A76,A112のCellをActiveしても ComboBox4.DropDown しません。 そこで、テスト2のように For~Nextを二つに分けました。 テスト2の方法しか無いのでしょうか? 宜しくお願いします。 Dim Row As Long 'テスト1 For Row = 4 To 112 Step 36 If Not Intersect(Target, Cells(Row, "A")) Is Nothing Then '今日の日付DropDown If Cells(Row - 3, "A").Value = "" Then form.ComboBox3.DropDown ElseIf Not Intersect(Target, Range(Cells(Row, "A"), Cells(Row + 13, "A"))) Is Nothing Then 'A列日付 form.ComboBox4.DropDown End If Next Dim Row As Long, iRow As Long 'テスト2 For Row = 4 To 112 Step 36 If Not Intersect(Target, Cells(Row, "A")) Is Nothing Then '今日の日付DropDown If Cells(Row - 3, "A").Value = "" Then form.ComboBox3.DropDown End If Next For iRow = 4 To 112 Step 36 If Not Intersect(Target, Range(Cells(iRow, "A"), Cells(iRow + 13, "A"))) Is Nothing Then 'A列日付 form.ComboBox4.DropDown End If Next

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • No.769915 の続きです。

    申し訳ありません、間違えて質問を締め切ってしまいました。 mshr1962さんに直して頂いた処理では、思ったとおりではありませんでした。説明不足で申し訳ありません。 やりたいことは、1回測定する毎にSheets("Result").Range("G20:I24")に入ってくるデータを、 SheetGRの表に貼り付ける作業をしたいのです。 1回目の測定結果はD7に貼付け、2回目の測定結果はD17へ…という具合で、10回目のD97まで貼付け終わったら、11回目からはM7~M97へコピー、21回目からはV7~V97へコピーをしたい。ということです。 今はマクロの実行ボタンをD列コピー用、M列コピー用、V列コピー用と分けていますが、できれば1つのボタンでできないかと思います。 分かり難くて申し訳ありません。意味不明であれば補足いたしますので、宜しくお願いします。  With sheetGR For ii = 7 To 97 Step 10(行の指定) For iii = 4 To 31 Step 9(列の指定) If .Cells(ii, iii) = "" Then .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _ = Sheets("Result").Range("G20:I24").Value End If Exit For If Cells(97, iii) <> "" Then Next iii End If Next ii End With

  • ExcelのVBAでコピーのやり方

    シート1のAL列の3行目以降の中から0以外の 値が入っているAJ列~AN列の行を全てコピーして、 シート2のB列~F列に貼り付けたいです。 シート2のB列~F列の7行目から下にコピーした値を入れていきたく、 値が入っていたらその次の行に貼り付けたいです。 例えば、7行目~15行目まで値が入っていたら、16行目から貼り付けるようにしたいです。↓のように書いてみたのですが、 コピーしている状態になるだけで、シート2の方へ貼り付けができない状態です。 また、オブジェクトが必要ですと表示が出ます。 どこをどうなおしたらいいでしょうか。 文章がわかりにくく申し訳ありません。 回答よろしくお願いいたします。 sub 値をコピー() Dim rTargetRange As Range, ii As Long Set rTargetRange = Nothing For ii = 4 To Cells(Rows.CountLarge, "AL").End(xlUp).Row If (Cells(ii, "AL").Value <> 0) Then If (rTargetRange Is Nothing) Then Set rTargetRange = Cells(ii, "AJ").Resize(, 5) Else Set rTargetRange = Application.Union(rTargetRange, Cells(ii, "AJ").Resize(, 5)) End If End If Next With Worksheets("sheet2") With .Cells(.Rows.CountLarge, "B").End(xlUp) If (.Row = 1 And .Value = "") Then rTargetRange.Copy .Offset(0) Else rTargetRange.Copy .Offset(1) End If End With End With End Sub また、↓のような違ったコードも試しましたが、 うまくいきませんでした。 N=Sheet2.Cells(Rows.CountLarge, "AL").End(xlUp).Row+1 SHEET1.SELECT For ii = 4 To Cells(Rows.CountLarge, "AL").End(xlUp).Row If Cells(ii, "AL").Valu e <> 0 Then RANGE("AJ" & ii & ":AN" & ii).COPY SHEET2.RANGE("B" & N) N=N+1 END IF NEXT

  • for文の使い方

    for文の中にif文を入れて使いたいのですが「Nextに対するforがありません」となりエラーが出てしまいます。どうしたらよいのでしょうか? If Option1.Value = True Then For i = 2 To 10  If xlSheet.Cells(i, 2).Value > 10 Then Form2.List1.AddItem xlSheet.Cells(i, 1) Next i End If End If

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • エクセル VBA for文について

    再び失礼します。 昨日VBAを始めた初心者です。 1、チェックボタン17個にそれぞれ変数を設定 2、2つだけチェックを入れると仮定して、実行ボタンを押したときに チェックが入っている2つの中で変数の大きいものをMax、小さいものをMinとしてシートに出力したいのですが、”ここ”と書いてあるところに Me("hensuu" & n). hensuu & n など入れてみたのですがエラーになります。 くだらないミスだと思いますがよくわかりません。 どなたかご教授お願いします。 Private Sub CommandButton2_Click() If Check1.Value = True Then hensuu1 = "9" End If If Check2.Value = True Then hensuu2 = "8" End If If Check3.Value = True Then hensuu3 = "7" End If If Check4.Value = True Then hensuu4 = "6" End If If Check5.Value = True Then hensuu5 = "5" End If If Check6.Value = True Then hensuu6 = "4" End If If Check7.Value = True Then hensuu7 = "3" End If If Check8.Value = True Then hensuu8 = "2" End If If Check9.Value = True Then hensuu9 = "1" End If If Check11.Value = True Then hensuu10 = "1/2" End If If Check11.Value = True Then hensuu11 = "1/3" End If If Check12.Value = True Then hensuu12 = "1/4" End If If Check13.Value = True Then hensuu13 = "1/5" End If If Check14.Value = True Then hensuu14 = "1/6" End If If Check15.Value = True Then hensuu15 = "1/7" End If If Check16.Value = True Then hensuu16 = "1/8" End If If Check14.Value = True Then hensuu17 = "1/9" End If Dim n As Long Dim Max As Long Dim Min As Long For n = 1 To 17 If Me("Check" & n).Value = True Then Max = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n For n = Max To 17 If Me("Check" & n).Value = True Then Min = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n Worksheets("Sheet1").Range("A1") = Min Worksheets("Sheet1").Range("B1") = Max MsgBox hensuu End Sub

  • VBAでのfor文について

    5行のデータがあるとして、先頭の文字がaで始まる行を削除して 上に詰めたいと考えています。 しかし、Range("i:i")のところに可変の数字iをうまく指定できて いないようで、うまく実行されません。 どこがまずいのでしょうか? Sub sample() Dim i As Integer For i = 1 To 5 activeworksheet.Cells(i, 2) = Mid(Cells(i, 1), 1, 1) If Cells(i, 2) = "a" Then ActiveSheet.Range("i:i").Delete shift:=xlshiftUp End If Next End Sub