『For to next コードでエラーがでます』(あい) VBA初心者です。 コードを書いていて、For to nextでループさせたいのですが、 どう見てもちゃんと書いているはずなのに next に対するforがありません、とエラーが出てしまいます。 どなたか助けてください・・・ Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).row Dim a As Long For a = 2 To r If Cells(a, 14) = "" Then If 伝票画面.Label2 = Cells(a, 7) Then Else End If Next a このnext a のほうが間違っているといわれます・・・・・ < 使用 Excel:unknown、使用 OS:Windows10 > ---- 下記記事の(1)Ifに対応するEnd Ifがない ですかね。 https://excel-toshokan.com/err-compile4/ (検索) 2022/02/27(日) 16:36 ---- 実は続きがありまして、最後に書いてありました・・・ Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).row Dim a As Long For a = 2 To r If Cells(a, 14) = "" Then If 伝票画面.Label2 = Cells(a, 7) Then Else End If Next a Dim i As Long With 伝票画面.ListBox1 For i = 16 To 90 Step 4 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) Next i End With End If (あい) 2022/02/27(日) 16:43 ---- ■1 提示する場合は、Sub〜End Subまでがプロシージャと呼ばれる1つのかたまりなので提示される場合はきちんと最初から最後まで提示されるとお互いに誤解がなくてよいとおもいます。 ■2 >VBA初心者です。 拘りが無ければ、きちんとインデントをつけてみるとよいと思います。 そうすれば気づくこともあるでしょう。 Sub 名もなきマクロ() Dim r As Long, a As Long, i As Long r = Cells(Rows.Count, 1).End(xlUp).Row For a = 2 To r If Cells(a, 14) = "" Then '★1 If 伝票画面.Label2 = Cells(a, 7) Then Else End If '↑★1に対するEnd Ifが抜けている Next a '★2に対応するIFがない With 伝票画面.ListBox1 For i = 16 To 90 Step 4 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) Next i End With End If '★2 End Sub (もこな2) 2022/02/27(日) 16:55 ---- ありがとうございます!!! 一番下に書いていたEnd If ('★2)が、★1に対するEnd Ifのつもりだったのですが、 (※★1だったら、With以降のコードを動かしたいため・・・) まだまだ勉強が足りないようです。 これではやりたいコードが走っていないので、もう少し考えてみます。 とりあえずエラーはなくなりました、ありがとうございました!! (あい) 2022/02/27(日) 17:15 ---- >一番下に書いていたEnd If ('★2)が、★1に対するEnd Ifのつもりだった 繰り返しになりますが、インデントをつけて見直してみることを強く勧めます。 とくに条件分岐の終わりとループの終わりが逆になっていたら意味がありませんよ。 また、対象のシートはきちんと明示するようにしたほうが良いと思います。 Sub 名もなきマクロ2() Dim r As Long, a As Long, i As Long Dim buf As Long For a = 2 To Sheets("record").Cells(Sheets("record").Rows.Count, 1).End(xlUp).Row If Sheets("record").Cells(a, 14).Value = "" Then If 伝票画面.Label2 = Sheets("record").Cells(a, 7).Value Then With 伝票画面.ListBox1 For i = 16 To 90 Step 4 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) Next i End With End If End If Next a End Sub (もこな2) 2022/02/27(日) 18:02 ---- 余談: 書籍には余り明示的に書かれていないかもしれませんが、 ┌For │ With 〇〇 ┐ └Next │ End With ┘ とか、 ┌With 〇〇 │ For ┐ └End With │ Next ┘ とかは、インデント以前にNGです。 印象的なキャッチフレーズがあればいいのですが、 「他人のブロックを横切ってはいけない」なんていうのはどうだろうか。 VBAには「ブロック」という概念はありませんが、 For ... Next や、Do .. Loop , With ... End With など、 ペアになって機能するものは、 下記のように、他のペアを中に持つことはありえても、 With 〇〇 For ''' Next End With 横切って使うことはありません。できません。 (γ) 2022/02/27(日) 18:24 ---- インデントが重要なことはご指摘の通りです。 誤解を招く書き方でした。 (γ) 2022/02/27(日) 19:08 ---- >書籍には余り明示的に書かれていないかもしれませんが、 ちょっと蛇足のコメントですが、 例えば、For...Next ステートメント https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fornext-statement でいえば、構文はこうなわけですが、 For counter = start To end [ Step step ] [ statements ] [ Exit For ] [ statements ] Next [ counter ] [ statements ] はステートメントを複数かけるんですが、 では、ステートメントはなにかという問題で、   ドキュメンtのタイトルが「For...Next ステートメント」となっているように この構文全体で、1つのステートメント。 おなじように、With ... End With で1つのステートメント ┌For │ With 〇〇 ┐ └Next │ End With ┘ は、For ... Next ステートメントの [ statements ] に 収まってないといけないWith ... End With ステートメントが はみ出してるということになります。 >印象的なキャッチフレーズがあればいいのですが、 >他人のブロックを横切ってはいけない」 For ... Next 、With ... End With , If ... End If ,etc は、 終区まで含めて1ステートメントだという認識をもつのが大事かなとおもいます。 「ステートメントを途中でぶった切ってはいけない」とか (´・ω・`) 2022/02/28(月) 09:23 ---- >For ... Next 、With ... End With , If ... End If ,etc は、 >終区まで含めて1ステートメントだという認識をもつのが大事かなとおもいます。 なるほどですね。 >For ... Next ステートメントの [ statements ] に >収まってないといけないWith ... End With ステートメントが >はみ出してるということになります。 # それを伺っていて、私は「脱腸」という病気を思い起こしました。 # いわば、コードの一部分が所定範囲に収まらずに、別のところにまで はみ出して しまっている # 「コード脱腸」状態というのかなと思いつきましたww。(印象的ではあるが、余り流行りそうもない。) (γ) 2022/02/28(月) 10:33 ---- みなさまありがとうございます。 ステートメントを途中で切ってはいけない・・・ Dim a As Long, i As Long ★1 For a = 2 To Sheets("record").Cells(Sheets("record").Rows.Count, 1).End(xlUp).row ☆1 If Sheets("record").Cells(a, 14).Value = "" Then  ☆2 If 伝票画面.Label2 = Sheets("record").Cells(a, 7).Value Then  Else ★1 Next a With 伝票画面.ListBox1 ★2 For i = 16 To 90 Step 4 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) ★2Next i End With ☆ End If ☆2 End If ★2 Next a この書き方は間違っているでしょうか、、? For to... with... end with next や、 For to if end if next などもでしょうか… 初心者すぎて申し訳ありません・・・・・ エラーになってしまう。。。 (あい) 2022/02/28(月) 11:40 ---- 今後のために、腑に落ちるまで理解したいのであれば、 コードの手続きをフローチャートに落とし込む事をおすすめします。 参考 https://gakushikiweblog.com/code-constitution 頭の中が整理されますよ。 (tkit) 2022/02/28(月) 12:06 ---- 記述の理解も進めるとして、 ひとまず、もこな2さんの2022/02/27(日) 18:02のコードの、 If 伝票画面.Label2 = を If 伝票画面.Label2 <> にすれば、 当該箇所については、希望の動きをするのでは無いでしょうか? ※コードの全容は明かされていないように思われるので。 (検索) 2022/02/28(月) 12:44 ---- ★1 For a = 2 To Sheets("record").Cells(Sheets("record").Rows.Count, 1).End(xlUp).row ☆1 If Sheets("record").Cells(a, 14).Value = "" Then 【もし14列i行が空白であり】  ☆2 If 伝票画面.Label2 = Sheets("record").Cells(a, 7).Value Then 【7列目がLabel2と一致したらなら】  Else ★1 Next a With 伝票画面.ListBox1 【Listboxにこれらの値を入れる】 ★2 For i = 16 To 90 Step 4 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) ★2Next i End With ☆ End If ☆2 End If ★2 Next a というコードを書いているつもりなのですが・・・ If やらForやらを混在させすぎでしょうか・・・ (あい) 2022/02/28(月) 13:08 ---- ■3 >この書き方は間違っているでしょうか、、? はい。間違っています。 再三にわたってコメントしているように、インデントを付けて整理してみることをお勧めします。 そのときに、ちゃんと【どれ】と【どれ】がペアなのか意識することが重要です。 それを踏まえて2022/02/28(月) 11:40に示されたコードを整理してみるとこうなります。 Sub 始まりも終わりもないマクロ() '[凡例] ★: ペアの始まり ◆:ペアの終わり Dim a As Long, i As Long For a = 2 To Sheets("record").Cells(Sheets("record").Rows.Count, 1).End(xlUp).Row '★1 If Sheets("record").Cells(a, 14).Value = "" Then '★2 If 伝票画面.Label2 = Sheets("record").Cells(a, 7).Value Then '★3 Else Next a '◆1 With 伝票画面.ListBox1 '★4 For i = 16 To 90 Step 4 '★5 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) Next i '◆5 End With '◆4 End If '◆3 End If '◆2 Next a '【相方おらず】 End Sub すなわち、◆3や◆2が出てくる前に、それより外側の◆1が出てきちゃったらおかしいのです。 (もこな2) 2022/02/28(月) 13:59 ---- [[20220228120300]] 『ステートメントを複数使用した場合』(あい) どっちで話をすすめるか整理してください。 (´・ω・`) 2022/02/28(月) 14:02 ---- とりあえず、話の続きなのでこちらに投稿しておきます。 ちなみに↓ならば、1の内側に2があって、その内側に3があって、その内側に4があって、その内側に5があるというような関係性なので問題がありません。 Sub 始まりも終わりもないマクロ2() '[凡例] ★: ペアの始まり ◆:ペアの終わり Dim a As Long, i As Long For a = 2 To Sheets("record").Cells(Sheets("record").Rows.Count, 1).End(xlUp).Row '★1 If Sheets("record").Cells(a, 14).Value = "" Then '★2 If 伝票画面.Label2 = Sheets("record").Cells(a, 7).Value Then '★3 Else 'Next a 【削除】 With 伝票画面.ListBox1 '★4 For i = 16 To 90 Step 4 '★5 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) Next i '◆5 End With '◆4 End If '◆3 End If '◆2 Next a '◆1 End Sub もっとも、検索さんの仰るように◆3のElse節にわざわざ書く必要もないとおもいますので、もう工夫して↓のような感じでもよいと思います。 Sub 始まりも終わりもないマクロ2改() '[凡例] ★:ペアの始まり ◆:ペアの終わり Dim a As Long, i As Long For a = 2 To Sheets("record").Cells(Sheets("record").Rows.Count, 1).End(xlUp).Row '★1 If Sheets("record").Cells(a, 14).Value = "" Then '★2 If Not 伝票画面.Label2 = Sheets("record").Cells(a, 7).Value Then '★3 With 伝票画面.ListBox1 '★4 For i = 16 To 90 Step 4 '★5 .AddItem "" .List(.ListCount - 1, 0) = Sheets("record").Cells(2, i) .List(.ListCount - 1, 1) = Sheets("record").Cells(2, i + 2) .List(.ListCount - 1, 2) = Sheets("record").Cells(2, i + 3) Next i '◆5 End With '◆4 End If '◆3 End If '◆2 Next a '◆1 End Sub (もこな2) 2022/02/28(月) 14:12 ---- カッコと閉じカッコ は一対一対応という例え話で考えたらいかがでしょうか IF は カッコ"(" で、対応する閉じカッコ")" は End If For は カッコ"{" で、対応する閉じカッコ"}" は Next With は カッコ"[" で、対応する閉じカッコ"]" は End With とそれぞれ別のカッコに割り当てて考えると 一方が一方を完全に含むのはOKだけど、交差するのはだめとか かえってわかりにくくければ、無視してください (とおりすがり) 2022/02/28(月) 15:08