Quello che stai vedendo è un errore di compilazione che indica che una parola chiave Else (o ElseIf) non è stata preceduta da una corretta istruzione If.

Significa che il compilatore ha trovato un’istruzione Else (che evidenzierà per l’utente) senza vedere un’istruzione If nelle righe precedenti. Questo è un errore perché viola la sintassi corretta di un’istruzione If-Then-Else. La sintassi corretta è la seguente:

Per usare la sintassi abbreviata per l’istruzione if che specifica una condizione e un’azione (per quando la condizione è soddisfatta):

If Then

Per usare la sintassi standard per un’istruzione If che specifica una condizione e un’azione (per quando la condizione è soddisfatta) e un’azione alternativa per quando la condizione non è soddisfatta:

If Then

Else

Fine se

Per specificare più di una condizione (e le loro azioni):

If Then

ElseIf Then

Else

Fine se

L’errore di compilazione “Else Without If” si verifica quando “If Then ” manca o è scritto male. Discutiamo ulteriormente le cause comuni dell’errore in dettaglio qui sotto con esempi.

Manca l’istruzione If

Quando il compilatore VBA vede che la parola chiave Else non è preceduta da un’istruzione If riconoscibile (corretta), genera un errore ‘Else senza If’. Per ogni Else, ci deve essere un’istruzione If. Tuttavia, per ogni If, non abbiamo necessariamente bisogno di una dichiarazione else.

Esempio 1: Dichiarazione If mancante

In questo esempio, mostriamo una casella di input che prende l’input dell’utente e lo memorizza in x. Poi incontriamo una parola chiave Else, ma non c’è nessuna dichiarazione If prima di essa. Questo causerà un errore del compilatore: Else Without If.

Per risolvere questo problema, dobbiamo solo aggiungere un’istruzione If. Una dichiarazione If consiste in If Then.

Seguire buone pratiche di indentazione è fondamentale per riconoscere se ogni logica if-else-then consiste delle necessarie parole chiave (dichiarazione If, parola chiave Else, parola chiave End If).

Se Quindi

Else

Se Quindi

Else

Fine Se

Fine Se

Esempio 2: L’istruzione Else è dentro un ciclo e l’istruzione If è fuori

Potresti essere sorpreso di ricevere l’errore quando hai già l’istruzione If presente nel codice e posta prima della parola chiave Else e scritta correttamente. Il problema potrebbe non essere evidente a prima vista. Ma se guardiamo più da vicino, vedremo che lo scopo dell’istruzione If è diverso da quello dell’istruzione else.

Tutto ciò che si trova tra l’istruzione If e la parola chiave End If appartiene allo scopo di questa istruzione If. Altri scopi possono anche esistere nel codice a causa dell’esistenza di cicli come For Next loop, Do Until loop o For Each Next loop.

Uno scopo esiste quando una dichiarazione logica richiede più parole chiave per indicare i punti di inizio e fine della dichiarazione. Si verifica un problema se si sovrappongono gli scope in un modo che fa sì che uno sia parzialmente inserito nell’altro. Il modo corretto di far lavorare più ambiti l’uno con l’altro è quello di averne uno totalmente inserito nell’altro.

Nell’esempio seguente, If Then è seguito dall’inizio di un For loop seguito dalla parola chiave Else . Questo separa l’istruzione If e la parola chiave Else e causa l’errore.

Sub Else_Without_If()x = InputBox("Set x value")'inizia l'istruzione if scopeIf x = 1 Then MsgBox "x value is equal to 1" 'inizia un nuovo scope (For Next loop) For R = 1 To 5'la parola chiave Else è separata dalla sua istruzione If perché è in un altro scope.Else Next R MsgBox "il valore x non è uguale a 1 "End IfEnd Sub

Per risolvere il problema, ci assicuriamo che l’istruzione logica If nel suo insieme sia completamente inclusa nel ciclo For. Oppure il ciclo For è completamente incluso nell’azione dell’istruzione logica If; tra If e Else o tra Else e End If.

Come regola generale, se una sezione del vostro codice ha un certo stato dovuto all’avere un punto iniziale e finale (If – Else, Else – End If, For – Next, Do – Until) allora non potete iniziare un’altra sezione (scope) al suo interno senza terminarla all’interno della prima sezione.

Punto d’inizio (If, Else, For, Do)

Un altro punto d’inizio

Fare qualcosa

Un altro punto finale

Punto finale (Else, End If, Next, Until)

Per applicare questo al nostro esempio, lo cambiamo nel seguente codice;

Sub Else_Without_If()x = InputBox("Imposta valore x")'inizia l'istruzione if scopeIf x = 1 Then MsgBox "il valore x è uguale a 1" 'inizia un nuovo scope (For Next loop) For R = 1 To 5 MsgBox "x è uguale a 1" 'terminando il nuovo ambito all'interno dello stesso ambito in cui è stato iniziato Next RElse MsgBox "il valore x non è uguale a 1 "End IfEnd Sub

Incorrect If Statement

Example 3: Mettere l’azione sulla stessa linea con l’istruzione If

Un altro errore molto comune che si fa spesso è quello di scrivere l’istruzione If in un modo che non è compatibile con l’utilizzo della parola chiave Else.

Se vogliamo usare la parola Else, dobbiamo mettere la parte di azione della logica If-Then-Else nella linea successiva all’istruzione if. Se non stiamo usando la parola chiave Else, allora possiamo mettere l’azione sulla stessa linea dell’istruzione If e non scriviamo la parola chiave Else o la parola chiave End If.

Quando l’azione (che dovrebbe essere eseguita se la condizione è vera) è posta sulla stessa linea dell’istruzione If, allora l’istruzione If è considerata completa. Questo è considerato un modo abbreviato di scrivere la logica If – then.

Questo è il motivo per cui quando il compilatore incontra una parola chiave Else dopo questa, non trova un’istruzione If che appartiene alla parola chiave Else, perché quell’istruzione If è stata completata mettendo l’azione sulla linea come l’istruzione If. Il seguente codice NON è corretto e causerà l’errore del compilatore: Else senza If.

L’azione (MsgBox "x value is equal to 1") deve essere messa sulla riga successiva all’istruzione If per poter avere un’istruzione Else usata nella logica If-Then-Else. Nel codice seguente, abbiamo spostato l’istruzione di azione nella riga successiva, il che risolve il problema.

Abbiamo ora coperto tutte le possibili cause di errore di compilazione: Else senza if. Per ricapitolare, se ottieni questo errore, controlla se

1) C’è un’istruzione If che precede la parola chiave Else.

2) La linea dell’istruzione If non contiene altro che If Then.

3) Verifica che l’istruzione If e la parola chiave Else non siano separate da un altro ambito o sezione, come i loop.

Vedi anche: Come risolvere l’errore “End If senza blocco If”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.