Tag Archives: Decisão

VBA – A Instrução GoTo

O que é?

É um desvio incondicional para uma linha especificada dentro de uma função VBA.

Estrutura

GoTo [label]

O argumento [label] obrigatório pode ser qualquer rótulo de linha ou número de linha.
rótulo de linha

Utilizado para identificar uma única linha de código. Um rótulo de linha pode ser qualquer combinação de caracteres que inicie com uma letra e termine com dois-pontos (:). Os rótulos de linha não diferenciam maiúsculas de minúsculas e devem iniciar na primeira coluna.
número de linha

Utilizado para identificar uma única linha de código. Um número de linha pode ser qualquer combinação de dígitos que seja exclusiva dentro do módulo no qual é utilizado. Os números de linha devem iniciar na primeira coluna.

Exemplo

Abaixo segue um trecho de código que refleto o uso do Goto:

1
2
3
4
5
6
7
8
9
10
11
12
Public Sub TesteGoto()
    MsgBox "Inicio da função"
    GoTo Rotulo2
Rotulo1:
    MsgBox "Executando Rotulo1"
    GoTo Saida
Rotulo2:
    MsgBox "Executando Rotulo2"
    GoTo Rotulo1
Saida:
    MsgBox "Fim da função"
End Sub

O código acima mostra mensagens em uma sequência definida pela instrução Goto. A instrução não obedece nenhum critério, mesmo sendo executada de dentro uma estrutura condicional (If…Else) ou de repetição (While, For, For Each), fazendo desvio conforme informado. Neste caso, a instrução segue a sequência de execução normalmente até a linha 4, quando é desviada para o Rotulo2 na linha 9, que executa até a linha 11 que desvia a execução para o Rotulo1 na linha 6, que por fim executa até a instrução na linha 8 e quando é desviada para o Saida na linha 12, seguindo a execução até o fim da função.

Veja este outrou exemplo de código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub TesteGoto2()
 
    MsgBox "Inicio da função"
    GoTo Saida
 
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
    MsgBox "Conteúdo da função"
 
Saida:
    MsgBox "Fim da função"
End Sub

Neste caso, por conta do desvio na linha 4 para o rotulo Saida na linha 15, todas as instruções das linhas 5 a 14 nunca serão executadas.

Comentários

GoTo pode desviar somente para linhas de dentro da função em que é colocado.

Observação Excesso de instruções GoTo pode tornar difícil a leitura e depuração do código. Sempre que possível, use instruções de controle estruturado (Do…Loop, For…Next, If…Then…Else, Select Case).