visual - for next vba excel ejemplos
Continuar por el bucle (7)
Tengo el siguiente código
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
Así que pensé que podría simplemente tener la declaración Then Next x
, pero esto da un error de "no declaración declarada".
Entonces, ¿qué puedo poner después de If instr(sname, "Configuration item") Then
para que proceda al siguiente valor para x?
A veces hago un ciclo doble do:
Do
Do
If I_Don''t_Want_to_Finish_This_Loop Then Exit Do
Exit Do
Loop
Loop Until Done
Esto evita tener "goto spaghetti"
Está pensando en una declaración continue
como Java''s o Python''s , pero VBA no tiene esa declaración nativa, y no puede usar Next
de VBA de esa manera.
Podrías lograr algo como lo que estás tratando de hacer usando una declaración GoTo
lugar, pero realmente, GoTo
debería reservarse para los casos donde las alternativas son artificiales y poco prácticas.
En su caso con una sola condición de "continuar", hay una alternativa realmente simple, limpia y legible:
If Not InStr(sname, "Configuration item") Then
''// other code to copy paste and do various stuff
End If
Esto también se puede resolver usando un booleano.
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
Por ejemplo, aquí está el ejemplo completo que:
(1) Identifica el rango de celdas utilizadas en la hoja de trabajo
(2) Bucles a través de cada columna
(3) SI el título de la columna es un título aceptado, pasa por todas las celdas de la columna
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
Nota: Si no lo atrapó inmediatamente, la línea If docol Then
es su CONTINUACIÓN invertida. Es decir, si doCol
permanece False, la secuencia de comandos CONTINÚA en la celda siguiente y no hace nada.
Ciertamente, no es tan rápido / eficiente como un continue
apropiado o next for
enunciado, pero el resultado final es lo más cercano que he podido obtener.
Muchos años después ... Me gusta este:
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
Puede usar un 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
Unos años tarde, pero aquí hay otra alternativa.
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
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