Ceea ce vedeți este o eroare de compilare care indică faptul că un cuvânt cheie Else (sau ElseIf) nu a fost precedat de o instrucțiune If corectă.

Înseamnă că compilatorul a găsit o instrucțiune Else (pe care o va evidenția pentru utilizator) fără să vadă o instrucțiune If în liniile de deasupra ei. Aceasta este o eroare deoarece încalcă sintaxa corectă a unei instrucțiuni If-Then-Else. Sintaxa corectă este următoarea:

Pentru a folosi sintaxa prescurtată pentru instrucțiunea if care specifică o condiție și o acțiune (pentru atunci când condiția este îndeplinită):

If Then

Pentru a utiliza sintaxa standard pentru o instrucțiune If care specifică o condiție și o acțiune (pentru atunci când condiția este îndeplinită) și o acțiune alternativă pentru atunci când condiția nu este îndeplinită:

If Then

Else

.

End if

Pentru specificarea mai multor condiții (și a acțiunilor acestora):

Dacă Atunci

Dacă Atunci

Dacă

.

End if

Errorul de compilare „Else Without If” apare atunci când „If Then ” lipsește sau este scris incorect. Să discutăm mai jos, în detaliu, cauzele comune ale erorii, cu exemple.

Missing If Statement

Când compilatorul VBA vede că cuvântul cheie Else nu este precedat de o instrucțiune If recognoscibilă (corectă), generează o eroare „Else fără If”. Pentru fiecare Else, trebuie să existe o instrucțiune If. Cu toate acestea, pentru fiecare If, nu avem neapărat nevoie de o instrucțiune else.

Exemplu 1: Instrucțiune If lipsă

În acest exemplu, afișăm o casetă de introducere a datelor care preia datele introduse de utilizator și le stochează în x. Apoi întâlnim un cuvânt cheie Else, dar nu a existat nicio instrucțiune If înainte de acesta. Acest lucru, într-adevăr, va cauza o eroare de compilare: Else Without If.

Pentru a rezolva această problemă, trebuie doar să adăugăm o instrucțiune If. O instrucțiune If este formată din If Then.

Continuarea bunelor practici de indentare este crucială pentru a recunoaște dacă fiecare logică if-else-then este formată din cuvintele cheie necesare (instrucțiunea If, cuvântul cheie Else, cuvântul cheie End If).

Dacă Atunci

Este

Dacă Atunci

. Else

End If

End If

Exemplu 2: Instrucțiunea Else este în interiorul unei bucle, iar instrucțiunea If este în afara acesteia

S-ar putea să fiți surprins de faptul că primiți eroarea atunci când aveți deja instrucțiunea If prezentă în cod și plasată înainte de cuvântul cheie Else și scrisă corect. Este posibil ca problema să nu fie evidentă la prima vedere. Dar dacă ne uităm mai atent, vom vedea că domeniul de aplicare al instrucțiunii If este diferit de cel al instrucțiunii Else.

Tot ce se află între instrucțiunea If și cuvântul cheie End If aparține domeniului de aplicare al acestei instrucțiuni If. Pot exista și alte domenii de cuprindere în cod datorită existenței buclelor, cum ar fi bucla For Next, bucla Do Until sau bucla For Each Next.

Un domeniu de cuprindere există atunci când un enunț logic necesită mai multe cuvinte cheie pentru a indica punctele de început și de sfârșit ale enunțului. Apare o problemă dacă suprapuneți domenii de aplicare într-un mod care face ca unul să fie plasat parțial în interiorul celuilalt. Modul corect de a face ca mai multe domenii de cuprindere să funcționeze unul cu celălalt este ca unul să fie plasat în totalitate în interiorul celuilalt.

În următorul exemplu, If Then este urmat de începutul unei bucle For urmată de cuvântul cheie Else . Acest lucru separă instrucțiunea If și cuvântul cheie Else și determină apariția erorii.

Sub Else_Without_If()x = InputBox("Set x value")'începerea instrucțiunii if scopeIf x = 1 Then MsgBox "x value is equal to 1" 'începerea unui nou scope (For Next loop) For R = 1 To 5'Cuvântul cheie Else este separat de instrucțiunea sa If deoarece se află într-un scope diferit.Else Next R MsgBox "x value is not equal to 1 "End IfEnd IfEnd Sub

Pentru a remedia problema, ne asigurăm că instrucțiunea logică If în ansamblul ei este complet cuprinsă în cadrul buclei For. Sau bucla For este cuprinsă în totalitate în cadrul instrucțiunii logice If Action; între If și Else sau între Else și End If.

De regulă, dacă o secțiune a codului dumneavoastră are un anumit statut datorită faptului că are un punct de început și un punct de sfârșit (If – Else, Else – End If, For – Next, Do – Until), atunci nu puteți începe o altă secțiune (domeniu de aplicare) în cadrul acesteia fără a o termina în cadrul primei secțiuni.

Punct de început (If, Else, For, Do)

Un alt punct de început

Fă ceva

Un alt punct de sfârșit

Punct de sfârșit (Else, End If, Next, Until)

Pentru a aplica acest lucru la exemplul nostru, îl schimbăm în următorul cod;

Sub Else_Without_If()x = InputBox("Set x value")'începerea instrucțiunii if scopeIf x = 1 Then MsgBox "x value is equal to 1" 'începerea unui nou scope (For Next loop) For R = 1 To 5 MsgBox "x value is equal to 1" 'terminarea noului domeniu de aplicare în cadrul aceluiași domeniu de aplicare în care a fost început Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub

Instrucțiune If incorectă

Exemplu 3: Plasarea acțiunii pe aceeași linie cu instrucțiunea If

O altă greșeală foarte frecventă care se face adesea este scrierea instrucțiunii If într-un mod care nu este compatibil cu utilizarea cuvântului cheie Else.

Dacă dorim să folosim cuvântul cheie Else, trebuie să plasăm partea de acțiune a logicii If-Then-Else în următoarea linie după instrucțiunea if. Dacă nu folosim cuvântul cheie Else, atunci putem plasa acțiunea pe aceeași linie cu instrucțiunea If și nu scriem cuvântul cheie Else sau cuvântul cheie End If.

Când acțiunea (care trebuie efectuată dacă condiția este adevărată) este plasată pe aceeași linie cu instrucțiunea If, atunci instrucțiunea If este considerată completă. Acesta este considerat un mod prescurtat de scriere a logicii If – then.

De aceea, atunci când compilatorul întâlnește un cuvânt cheie Else după acesta, nu găsește o instrucțiune If care aparține cuvântului cheie Else, deoarece acea instrucțiune If a fost completată prin plasarea acțiunii pe aceeași linie ca și instrucțiunea If. Următorul cod NU este corect și va cauza o eroare de compilare: Else fără If.

Acțiunea (MsgBox "x value is equal to 1") trebuie să fie plasată pe următorul rând după instrucțiunea If pentru a putea avea o instrucțiune Else utilizată în logica If-Then-Else. În codul următor, am mutat instrucțiunea action la rândul următor, ceea ce rezolvă problema.

Acum am acoperit toate cauzele posibile ale erorii de compilare: Else fără if. Pentru a recapitula, dacă primiți această eroare, verificați dacă

1) Există o instrucțiune If la locul ei care precede cuvântul cheie Else.

2) Linia instrucțiunii if nu conține nimic altceva decât If Then.

3) Verificați dacă instrucțiunea If și cuvântul cheie Else nu sunt separate de un alt domeniu de aplicare sau secțiune, cum ar fi buclele.

Vezi, de asemenea: Cum se remediază eroarea „End If fără bloc If”

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.