[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
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
■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
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
>書籍には余り明示的に書かれていないかもしれませんが、
ちょっと蛇足のコメントですが、
例えば、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
★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
再三にわたってコメントしているように、インデントを付けて整理してみることをお勧めします。
そのときに、ちゃんと【どれ】と【どれ】がペアなのか意識することが重要です。
それを踏まえて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
どっちで話をすすめるか整理してください。 (´・ω・`) 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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.