Tag Archives: For…Next

VBA – Saindo do controle de fluxo (comando Exit)

O que é?

A instrução Exit sai de um bloco de código Do…Loop, For…Next, Function, Sub ou Property.

Estrutura:

Exit Do

Fornece um meio de sair de uma instrução Do…Loop. Pode ser usada somente dentro de uma instrução Do…Loop. Exit Do transfere o controle para a instrução seguinte à instrução Loop. Quando usada dentro de instruções Do…Loop aninhadas, Exit Do transfere o controle para o loop que está aninhado em um nível acima do loop onde ocorre Exit Do.

Exit For

Fornece um meio de sair de um loop For. Pode ser usada somente em um loop For…Next ou For Each…Next. Exit For transfere o controle para a instrução seguinte à instrução Next. Quando usada dentro de loops For aninhados, Exit For transfere o controle para o loop que está aninhado em um nível acima do loop onde ocorre Exit For.

Exit Function

Sai imediatamente do procedimento Function em que aparece. A execução continua com a instrução seguinte à instrução que chamou Function.

Exit Property

Sai imediatamente do procedimento Property em que aparece. A execução continua com a instrução seguinte à instrução que chamou o procedimento Property.

Exit Sub

Sai imediatamente do procedimento Sub em que aparece. A execução continua com a instrução seguinte à instrução que chamou o procedimento Sub.

Exemplo

Um exemplo útil para o uso das instruções é Exit é no caso de um loop For…Next. Supondo que estivéssemos buscando um determinado valor dentro de uma coleção de itens de 10 posíções. A alternativa mais comum é verificar a lista item a item comparando-os até que encontrar o item que se deseja. Caso o item estivesse na 10º posição, não haveria tanto problemas. Mas se ele estivesse na 2º posição, porque continuar o executando o código até a 10º posição se já achamos o item?

Veja o código abaixo:

Function ProcuraNome(nome As String) As Boolean
    Dim nomes(10) As String
    Dim i As Long
    Dim quantInteracoes As Long
    Dim resultado As Boolean
 
    nomes(0) = "João"
    nomes(1) = "Maria"
    nomes(2) = "Júlio"
    nomes(3) = "Fabio"
    nomes(4) = "Guilherme"
    nomes(5) = "Roberto"
    nomes(6) = "Francisco"
    nomes(7) = "Juliana"
    nomes(8) = "Fabiana"
    nomes(9) = "Alex"
 
    For i = 0 To 9 Step 1
        quantInteracoes = i + 1
        If nome = nomes(i) Then
            resultado = True
        End If
    Next
 
    MsgBox quantInteracoes
 
    ProcuraNome = resultado
End Function

O código declara uma matriz de tamanho 10 com nomes de pessoas e todas as suas posições. Passando um nome por parâmetro, a função retorna VERDADEIRO se o nome existir na lista e FALSO caso contrário. A matriz é preenchida entre as linhas 7 e 16 e a busca é feita em uma laço For…Next nas linhas 18 a 23.

A variável quantInteracoes foi criada para verificar quantas vezes o laço For…Next do código faz interações, quantidade esta que é mostrada numa caixa de mensagem na linha 25.

Para testar a função, em qualquer célula de sua planilha e digite =ProcuraNome(“João”). Veja que a função retona o valor VERDADEIRO, o que significa que o nome consta na lista. Se informar qualquer outro nome, por exemplo “Sérgio”, a função retornará FALSO. Note que independente do nome informado, exista ele ou não na lista, uma caixa de mensagem com a quantidade 10 sempre. Isso significa que, mesmo que o laço encontre o nome na primeira posição, ele continua executando o laço até a última posição. Se a lista contivesse 1000 nomes, o código ficaria muito demorado.

Mas como apenas queremos saber se o nome existe na lista, não há necessidade de continuar executando o laço quanto a condição da linha 20 for atendida. Então, veja a modificação feita na código:

    ...
    For i = 0 To 9 Step 1
        quantInteracoes = i + 1
        If nome = nomes(i) Then
            resultado = True
            Exit For
        End If
    Next
    ...

Adicionando a cláusula Exit For como feito no código acima, ao atender a condição da linha 20, o código sairá do laço For…Next e continuára a exeução na linha 24. Depóis de fazer a modificação, em qualquer célula de sua planilha e digite =ProcuraNome(“João”). Veja que ao invés do valor 10, a caixa de mensagem mostrará 1. Se colocar =ProcuraNome(“Maria”), a caixa de mensagem apresentará 2 e assim por diante.

Além de evitarmos trabalho desnecesário, aumentamos a performance da função para a maior parte dos casos em que ela for utilizada.

Comentários

Não confunda instruções Exit com instruções End. Exit não define o fim de uma estrutura.

Como a instrução Exit desvia a execução do código, é aconselhável usá-la somente se o código da função estiver bem estruturado, principalmente para os casos de Function e Sub.