Avançar para o próximo item dentro de um loop For-Next
Pergunta
Eu tenho um loop For-Next.Dentro do loop eu testo vários critérios diferentes e se algum teste falhar, então estou pronto para pular o restante do código no loop e avançar para o "próximo" item.Atualmente, a maneira como lido com isso é com uma instrução GoTo que me leva à linha logo antes de "Próximo".Prefiro não usar uma instrução GoTo. Existe outra maneira de avançar para o "próximo" item dentro de um loop For-Next?TIA!
For x = 1 to 10
Test 1
If Test 1 fails then
GoTo Line1
End if
Test 2
If Test 2 fails then
GoTo Line1
End if
.
.
.
If all tests pass then
add item to array
End if
Line1:
Next
Solução
Aqui está uma solução alternativa para a falta de um continue
palavra-chave:
For x = 1 to 10
Do
Test 1
If Test 1 fails then
Exit Do
End if
Test 2
If Test 2 fails then
Exit Do
End if
.
.
.
If all tests pass then
add item to array
End if
Loop While False
Next
Outras dicas
Infelizmente não há continue
declaração semelhante em um for
loop em vba.(A estrutura de controle relacionada Exit For
existe, mas isso não ajuda em nada aqui).
E é bom que você tenha reservas em usar um GoTo
:eles tornam o código difícil de seguir.
Sua melhor aposta é colocar o código no loop em uma função separada e usar Exit Function
dentro dessa função em pontos apropriados.Você pode até então retransmitir códigos de erro de volta ao chamador, ajudando o código a ser dimensionado.
Você pode usar if else ladder :
For x = 1 to 10
if test 1
else if test 2
else if test 3
.
.
.
.
else
add item to array
end if
Next
Além de Goto, não há nenhuma maneira direta de pular entre o seu código, espero que isso possa ajudar.
Se você não tiver muitos testes, você pode usar o Not
condicionar e construir um aninhado If
declaração.Isso deve ter quase o mesmo efeito que você está pedindo, já que qualquer teste com falha encerraria isso If
instrução e mova o código para o próximo X em seu loop sem executar os testes a seguir.
Aqui está um exemplo do que quero dizer - um loop de dois testes que constrói uma matriz contendo os números de 5 a 10:
Sub TestConditionalPass()
Dim intX As Integer
Dim intArray() As Integer
ReDim intArray(1)
For intX = 1 To 10
If Not intX -2 < 1 Then
If Not intX * 2 < 10 Then
ReDim Preserve intArray(UBound(intArray) + 1)
intArray(UBound(intArray)) = intX
End If
End If
Next intX
End Sub
Como você está executando uma ação somente se todos os testes forem bem-sucedidos, execute a instrução if com ands. VBA não causa curto-circuito os testes (ou seja,ele avaliará cada caso de teste, mesmo que o primeiro retorne falso.) Eu sugeriria encapsular cada teste em uma função que retorne um booleano para manter seu código organizado.
If Test1() and _
Test2() and _
testn() THEN
add item to array
End if
Outra forma é fazer uso de uma variável booleana em seu código, como esta
Dim Success as Boolean
Success=True
Test 1
If Test 1 fails then
Success=false
End if
Test 2
If Test 2 fails then
Success=false
End if
.
.
.
If Success then
add item to array
End if
Se os testes forem caros, você pode adicionar uma instrução if interna para verificar se precisamos avaliar o próximo teste como este
If Success Then
If Test n fails then
Success=false
End If
End if