O que você está vendo é um erro de compilação que indica que uma palavra-chave Else (ou ElseIf) não foi precedida por uma declaração If correta.
Meaning, o compilador encontrou uma declaração Else (que destacará para o usuário) sem ver uma declaração If nas linhas acima dela. Isto é um erro porque viola a sintaxe correta de um comando If-Then-Else. A sintaxe correta é a seguinte:
Para usar a sintaxe de if que especifica uma condição e uma ação (para quando a condição é satisfeita):
Se
Então
Para usar a sintaxe padrão para uma instrução If que especifica uma condição e uma ação (para quando a condição é satisfeita) e uma ação alternativa para quando a condição não é satisfeita:
Se
Então
>
>Else
End if
Para especificar mais de uma condição (e as suas acções):
Se
Então
>
ElseIf
Então
Else
>
>
>
End if
O erro de compilação “Else Without If” ocorre quando “If
Então
” está em falta ou escrito incorrectamente. Vamos discutir as causas comuns do erro mais detalhadamente abaixo com exemplos.
Missing If Statement
Quando o compilador VBA vê que a palavra-chave Else não é precedida por uma declaração If reconhecível (correcta), gera um erro ‘Else without If’. Para cada Else, deve haver um comando ‘If’. Entretanto, para cada If, não precisamos necessariamente de um outro comando.
Exemplo 1: Faltando o comando If
Neste exemplo, mostramos uma caixa de entrada que pega a entrada do usuário e a armazena em x. Então encontramos uma palavra-chave Else, mas não havia um comando If antes dela. Isto de facto irá causar um erro de compilação: Else Without If.
Para resolver este problema, só precisamos de adicionar um comando If. Uma declaração If consiste em If
Then
.
Seguir as boas práticas de indentação é crucial para reconhecer se cada lógica if-else-then consiste nas palavras-chave necessárias (If statement, Else keyword, End If keyword).
Se
Então
Else
If
Então
Else
End If
>
End If
Exemplo 2: A declaração do outro lado está dentro de um laço e se a declaração estiver fora de
Você pode se surpreender que você esteja recebendo o erro quando você já tem a declaração de If presente no código e colocada antes da palavra-chave Else e escrita corretamente. O problema pode não ser aparente à primeira vista. Mas se olharmos mais de perto, veremos que o escopo do comando If é diferente do do outro comando.
Qualquer coisa entre o comando If e a palavra-chave End If pertence ao escopo deste comando If. Outros escopos também podem existir no código devido à existência de loops como For Next loop, Do Until loop ou For Each Next loop.
Existe um escopo quando uma instrução lógica requer múltiplas palavras-chave para indicar os pontos de início e fim da instrução. Um problema ocorre se você sobrepõe escopos de uma forma que faz com que um seja parcialmente colocado dentro do outro. A forma correcta de ter múltiplos âmbitos a funcionar um com o outro é ter um totalmente colocado dentro do outro.
No exemplo seguinte, Se
Então
é seguido pelo início de um Para
loop seguido do Else
palavra-chave. Isso separa a instrução If e a palavra-chave Else e faz com que o erro apareça.
Sub Else_Without_If()x = InputBox("Definir valor x")'iniciando o escopo da instrução ifIf x = 1 Então a MsgBox "valor x é igual a 1" 'iniciando um novo escopo (Para o próximo loop) Para R = 1 até 5'A palavra-chave Else é separada da sua instrução If porque está em um escopo diferente.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
Para corrigir o problema, asseguramos que a instrução If logical statement como um todo seja totalmente englobada dentro do laço For. Ou o laço For é totalmente englobado dentro da expressão lógica If Action; entre If e Else ou entre Else e End If.
Como regra geral, se uma seção do seu código tem algum status devido a ter um ponto inicial e final (If – Else, Else – End If, For – Next, Do – Until) então você não pode iniciar outra seção (escopo) dentro dela sem terminá-la dentro da primeira seção.
Ponto Inicial (If, Else, For, Do)
Outro Ponto Inicial
Fazer Algo
Outro Ponto Final
Ponto Final (Else, End If, Next, Until)
Para aplicar isto ao nosso exemplo, mudamos para o seguinte código;
Sub Else_Without_Without_If()x = InputBox("Set x value")'starting the if scope da instrução if x = 1 Then MsgBox "x value is equal to 1" 'starting a new scope (For Next loop) For R = 1 To 5 MsgBox "x valor é igual a 1" 'terminando o novo escopo dentro do mesmo escopo que foi iniciado em Next RElse MsgBox "valor x não é igual a 1 "End IfEnd Sub
Incorrect If Statement
Example 3: Colocando a ação na mesma linha com If Statement
Um outro erro muito comum que é cometido frequentemente é escrever a declaração If de uma forma que não é compatível com a utilização da palavra-chave Else.
Se quisermos usar a palavra-chave Else, devemos colocar a parte da ação da lógica If-Then-Else na próxima linha após a instrução if. Se não estivermos usando a palavra-chave Else, então podemos colocar a ação na mesma linha da instrução If e não escrevermos a palavra-chave Else ou a palavra-chave End If.
Quando a ação (que deve ser executada se a condição for verdadeira) for colocada na mesma linha da instrução If, então a instrução If é considerada completa. Isto é considerado uma forma abreviada de escrever a instrução If – then logic.
É por isso que quando o compilador encontra uma palavra-chave Else depois disso, ele não encontra uma instrução If que pertença à palavra-chave Else, porque essa instrução If foi completada com a colocação da ação na linha como a instrução If. O código a seguir NÃO está correto e causará o erro do compilador: Else sem If.
A ação (MsgBox "x value is equal to 1"
) precisa ser colocada na próxima linha após o comando If para que seja possível ter um comando Else usado na lógica If-Then-Else. No código seguinte, movemos o comando action para a linha seguinte, o que corrige o problema.
Agora já cobrimos todas as causas possíveis de erro de compilação: Senão sem “se”. Para recapitular, se você obtiver este erro, verifique se
1) Existe uma instrução If no lugar que precede a palavra-chave Else.
2) A linha da instrução if não contém nada além de If
Then
.
3) Verifique se a instrução If e a palavra-chave Else não estão separadas por outro escopo ou seção, como loops.
See também: Como corrigir o erro “End If sem bloco If”