Excel VBA-ループの終了


181

for内部の条件が満たされたときにループを終了したいと思います。条件が満たされたforときにループを終了するにはどうすればよいifですか?私は私のif声明の終わりにある種の出口を考えていますが、それがどのように機能するかわかりません。

Dim i As Long
For i = 1 To 50
    Range("B" & i).Select
    If Range("B" & i).Value = "Artikel" Then
        Dim temp As Long
        temp = i
    End If
Next i
Range("A1:Z" & temp - 1).EntireRow.Delete Shift:=xlToLeft

13
If [condition] Then Exit Forあなたのループの内側
Dan

回答:


333

ループを早く終了するには、 Exit For

If [condition] Then Exit For


1
@nixda共有したハイパーリンクがOffice VBAドキュメントではなくVB.NETドキュメントをポイントしているため、コメントを削除してください。VBAのExitステートメントには、VB.NETのオプションよりも少ないオプションがあります。実際、VBAがサポートするのはExit Do Exit For Exit Function Exit Property、およびのみExit Subです。VBAにはありませんExit While。正しいリンクは次のとおりです。OfficeVBAリファレンス
Excelヒーロー

@ExcelHero完了
nixda

27

Forループを早期に終了する別の方法は、ループカウンターを変更することです。

For i = 1 To 10
    If i = 5 Then i = 10
Next i

Debug.Print i   '11

For i = 1 To 10
    If i = 5 Then Exit For
Next i

Debug.Print i   '5

3
ループカウンターの割り当ては、明示的にループを終了するよりも堅牢性が低く、将来も保証されません。前者はループカウンターの最大値を変更すると壊れる可能性があります。コードが変更され、エディターが他の場所でも使用されていることに気付かない場合です。また、For Eachループには適用されません。
jpmc26 2018

2
これは、Forループに固有の質問に対する別の解決策For Eachです(ではありません)。長所と短所は、さまざまなソリューションやさまざまな状況に適用されます。たとえば、これはGo To label、ロジック(非構造化プログラミング)にブレーキをかけるものよりも堅牢な形式です。または、ContinueVBAにないキーワードの可能な回避策です。Exit Forロジックがオブジェクトの適切なクリーンアップを実行しない場合にも、のメリットに疑問を投げかけることができます。ただし、ここでは不適切な実装はあまり関係ありません(@ jpmc26)
paul bica

0

以下で与えられる最初の答えは、確かにimoのベストプラクティスです。

if i = 0 then exit for

ただし、これもオプションです。

Sub some()

Count = 0
End_ = ThisWorkbook.Sheets(1).Range("B1047854").End(xlUp).Row

While Count < End_ And Not ThisWorkbook.Sheets(1).Range("B" & Count).Value = "Artikel"
    Count = Count + 1
    If ThisWorkbook.Sheets(1).Range("B" & Count).Value = "Artikel" Then
        ThisWorkbook.Sheets(1).Range("A1:Z" & Count - 1).EntireRow.Delete Shift:=xlToLeft
    End If
Wend

End Sub
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.