web-dev-qa-db-ja.com

Forループを続行

私は次のコードを持っています

For x = LBound(arr) To UBound(arr)

    sname = arr(x)  
    If instr(sname, "Configuration item") Then  
        '**(here i want to go to next x in loop and not complete the code below)**  

    '// other code to copy past and do various stuff

Next x  

だから私は単純にステートメントThen Next xを持つことができると思ったが、これは「宣言されたforステートメントなし」エラーを与える。

それで、xの次の値に進むためにIf instr(sname, "Configuration item") Thenの後に何を置くことができますか?

55
DevilWAH

あなたは Javaの または Pythonの のようなcontinueステートメントを考えていますが、VBAにはそのようなネイティブステートメントがなく、できませんそのようなVBAのNextを使用します。

代わりにGoToステートメントを使用して、やろうとしていることのようなものを達成できますが、実際には、GoToは、代替が不自然で実用的でない場合のために予約する必要があります。

単一の「継続」状態の場合、本当にシンプルで、クリーンで、読みやすい代替手段があります。

    If Not InStr(sname, "Configuration item") Then
        '// other code to copy paste and do various stuff
    End If

GoToを使用できます:

Do

    '... do stuff your loop will be doing

    ' skip to the end of the loop if necessary:
    If <condition-to-go-to-next-iteration> Then GoTo ContinueLoop 

    '... do other stuff if the condition is not met

ContinueLoop:
Loop
82
VBA hack

何年も後...私はこれが好きです:

For x = LBound(arr) To UBound(arr): Do

    sname = arr(x)  
    If instr(sname, "Configuration item") Then Exit Do 

    '// other code to copy past and do various stuff

Loop While False: Next x
18
Alfredo Yong
For i=1 To 10
    Do 
        'Do everything in here and

        If I_Dont_Want_Finish_This_Loop Then
            Exit Do
        End If 

        'Of course, if I do want to finish it,
        'I put more stuff here, and then...

    Loop While False 'quit after one loop
Next i
13
Arlen Beiler

数年遅れましたが、別の選択肢があります。

For x = LBound(arr) To UBound(arr)
    sname = arr(x)  
    If InStr(sname, "Configuration item") Then  
        'Do nothing here, which automatically go to the next iteration
    Else
        'Code to perform the required action
    End If
Next x
6
moongster

これはブール値を使用して解決することもできます。

For Each rngCol In rngAll.Columns
    doCol = False '<==== Resets to False at top of each column
    For Each cell In Selection
        If cell.row = 1 Then
            If thisColumnShouldBeProcessed Then doCol = True
        End If
        If doCol Then
            'Do what you want to do to each cell in this column
        End If
    Next cell
Next rngCol

たとえば、以下は完全な例です。
(1)ワークシート上の使用済みセルの範囲を識別します
(2)各列をループします
(3)列のタイトルが受け入れられている場合、列のすべてのセルをループします

Sub HowToSkipForLoopIfConditionNotMet()
    Dim rngCol, rngAll, cell As Range, cnt As Long, doCol, cellValType As Boolean
    Set rngAll = Range("A1").CurrentRegion
    'MsgBox R.Address(0, 0), , "All data"
    cnt = 0
    For Each rngCol In rngAll.Columns
        rngCol.Select
        doCol = False
        For Each cell In Selection
            If cell.row = 1 Then
                If cell.Value = "AnAllowedColumnTitle" Then doCol = True
            End If
            If doCol Then '<============== THIS LINE ==========
                cnt = cnt + 1
                Debug.Print ("[" & cell.Value & "]" & " / " & cell.Address & " / " & cell.Column & " / " & cell.row)
                If cnt > 5 Then End '<=== NOT NEEDED. Just prevents too much demo output.
            End If
        Next cell
    Next rngCol
End Sub

注:すぐにキャッチしなかった場合、If docol Then行は反転したCONTINUEです。つまり、doColがFalseのままの場合、スクリプトは次のセルに進み、何もしません。

確かに、適切なcontinueまたはnext forステートメントほど高速/効率的ではありませんが、最終結果は私が手に入れることができるほど近いものです。

0
cssyphus