[[20220227162258]] 『For to next コードでエラーがでます』(あい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.