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?
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
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
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
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
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.