web-dev-qa-db-fra.com

Continuer pour boucle

J'ai le code suivant 

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  

J'ai donc pensé que je pourrais simplement avoir l'instruction Then Next x, mais cela donne l'erreur "non pour l'instruction déclarée".

Alors, que puis-je mettre après le If instr(sname, "Configuration item") Then pour qu'il passe à la valeur suivante pour x?

51
DevilWAH

Vous pensez à une instruction continue telle que Java's ou Python's , mais VBA n'a pas cette déclaration native et vous ne pouvez pas utiliser Next de VBA de cette façon. 

Vous pouvez obtenir quelque chose comme ce que vous essayez de faire en utilisant une instruction GoTo à la place, mais en réalité, GoTo devrait être réservé aux cas où les alternatives sont artificielles et irréalisables. 

Dans votre cas, avec une seule condition "continue", il existe une alternative très simple, propre et lisible:

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

Vous pouvez utiliser une 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
78
VBA hack

Beaucoup d'années après ... j'aime celui-ci:

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

Quelques années de retard, mais voici une autre 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

Cela peut aussi être résolu en utilisant un booléen. 

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

Par exemple, voici l'exemple complet qui:
(1) Identifie la plage de cellules utilisées sur la feuille de calcul
(2) Boucle dans chaque colonne
(3) Le titre de la colonne IF est un titre accepté. Parcourt toutes les cellules de la colonne.

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

Remarque: Si vous ne l'avez pas immédiatement attrapé, la ligne If docol Then est votre CONTINUER inversé. Autrement dit, si doCol reste Faux, le script CONTINUE vers la cellule suivante et ne fait rien.

Certainement pas aussi rapide/efficace qu'une déclaration continue ou next for appropriée, mais le résultat final est aussi proche que possible.

0
gibberish