Continue por loop

eu tenho o seguinte 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 

Então eu pensei que poderia simplesmente ter a declaração Then Next x , mas isso dá um erro “não para declaração declarada”.

Então, o que posso colocar após o If instr(sname, "Configuration item") Then para que ele continue para o próximo valor de x?

Você está pensando em uma instrução continue como Java ou Python , mas o VBA não tem essa declaração nativa, e você não pode usar o Next do VBA assim.

Você pode conseguir algo parecido com o que está tentando fazer usando uma instrução GoTo , mas, na verdade, o GoTo deve ser reservado para os casos em que as alternativas são planejadas e impraticáveis.

No seu caso, com uma única condição “continuar”, há uma alternativa realmente simples, limpa e legível:

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

Você pode usar um GoTo :

 Do '... do stuff your loop will be doing ' skip to the end of the loop if necessary: If  Then GoTo ContinueLoop '... do other stuff if the condition is not met ContinueLoop: Loop 

Muitos anos depois … eu gosto deste:

 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 

Alguns anos atrasado, mas aqui está outra 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 

Eu às vezes faço um loop duplo:

 Do Do If I_Don't_Want_to_Finish_This_Loop Then Exit Do Exit Do Loop Loop Until Done 

Isso evita ter “espaguete goto”

Isso também pode ser resolvido usando um 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 exemplo, aqui está o exemplo completo de que:
(1) Identifica o intervalo de células usadas na planilha
(2) Loops através de cada coluna
(3) SE título da coluna é um título aceito, faz um loop por todas as células na coluna

 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: Se você não pegou imediatamente, a linha If docol Then é a sua CONTINUAÇÃO invertida. Ou seja, se doCol permanecer False, o script CONTINUARá para a próxima célula e não fará nada.

Certamente não é tão rápido / eficiente quanto um continue adequado ou next for declaração, mas o resultado final é o mais próximo que consegui.