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
Foi útil?

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á continuedeclaraçã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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top