it-swarm.com.de

Weiter für Schleife

Ich habe den folgenden Code 

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  

Also dachte ich, ich könnte einfach die Anweisung Then Next x haben, aber dies ergibt den Fehler "Nein für Anweisung".

Was kann ich also nach der If instr(sname, "Configuration item") Then setzen, damit es zum nächsten Wert für x weitergeht?

51
DevilWAH

Sie denken an eine continue-Anweisung wie Javas oder Python's , aber VBA hat keine solche native Anweisung und Sie können VBAs Next nicht so verwenden. 

Sie könnten etwas erreichen, was Sie mit einer GoTo-Anweisung versuchen wollen, aber GoTo sollte eigentlich für Fälle reserviert sein, in denen die Alternativen sinnvoll und unpraktisch sind. 

In Ihrem Fall mit einer einzigen "Weiter" -Bedingung gibt es eine wirklich einfache, saubere und lesbare Alternative:

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

Sie können eine GoTo verwenden:

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
78
VBA hack

Viele Jahre danach ... Ich mag dieses hier:

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
16
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
12
Arlen Beiler

Ein paar Jahre später, aber hier ist eine andere Alternative.

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

Dies kann auch mit einem Boolean gelöst werden. 

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

Hier ist zum Beispiel das vollständige Beispiel:
(1) Gibt den Bereich der verwendeten Zellen im Arbeitsblatt an
(2) Durchläuft jede Spalte
(3) Der Titel der IF-Spalte ist ein akzeptierter Titel. Durchläuft alle Zellen in der Spalte

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

Hinweis: Wenn Sie es nicht sofort erkannt haben, ist die Zeile If docol Then Ihre invertierte FORTSETZUNG. Das heißt, wenn doCol False bleibt, fährt das Skript mit der nächsten Zelle fort und macht nichts.

Sicher nicht so schnell/effizient wie eine richtige continue- oder next for-Anweisung, aber das Endergebnis ist so nahe, wie ich es konnte.

0
gibberish