Az, amit lát, egy fordítási hiba, amely azt jelzi, hogy egy Else (vagy ElseIf) kulcsszó előtt nem volt egy megfelelő If utasítás.
Ez azt jelenti, hogy a fordító talált egy Else utasítást (amelyet a felhasználó számára kiemel) anélkül, hogy a felette lévő sorokban If utasítást látott volna. Ez hiba, mert sérti az If-Then-Else utasítás helyes szintaxisát. A helyes szintaxis a következő:
Az If utasítás rövidített szintaxisának használatára, amely egy feltételt és egy műveletet (a feltétel teljesülése esetén) ad meg:
If
Then
Az If utasítás standard szintaxisának használatához, amely egy feltételt és egy műveletet ad meg (arra az esetre, ha a feltétel teljesül), valamint egy alternatív műveletet arra az esetre, ha a feltétel nem teljesül:
If
Then
Else
.
End if
Egynél több feltétel (és azok műveleteinek) megadására:
Ha
akkor
ElseHa
akkor
Else
.
End if
A “Else Without If” fordítási hiba akkor jelentkezik, ha a “If
Then
” hiányzik vagy rosszul íródott. Az alábbiakban részletesen tárgyaljuk a hiba gyakori okait példákkal.
Missing If Statement
Ha a VBA fordító úgy látja, hogy az Else kulcsszót nem előzi meg egy felismerhető (helyes) If utasítás, akkor az “Else without If” hibát generálja. Minden Else-hez egy If utasításnak kell tartoznia. Azonban minden If-hez nem feltétlenül kell else utasítás.
1. példa: Hiányzó If utasítás
Ebben a példában egy beviteli mezőt jelenítünk meg, amely a felhasználó bemenetét fogadja és x-ben tárolja. Ezután találkozunk egy Else kulcsszóval, de előtte nem volt If utasítás. Ez valóban fordítói hibát okoz: Else Without If.
A probléma megoldásához csak egy If utasítást kell hozzáadnunk. Egy If utasítás If
Then
.
A jó behúzási gyakorlat követése kulcsfontosságú annak felismeréséhez, hogy minden if-else-then logika a szükséges kulcsszavakból áll-e (If utasítás, Else kulcsszó, End If kulcsszó).
Ha
akkor
Else
Ha
akkor
Else
End If
End If
Példa 2: Else utasítás egy cikluson belül van, az If utasítás pedig kívül
Meglepődhet, hogy a hibát akkor kapja, amikor az If utasítás már jelen van a kódban, és az Else kulcsszó elé van helyezve, és helyesen van megírva. A probléma első pillantásra nem biztos, hogy nyilvánvaló. De ha közelebbről megnézzük, akkor láthatjuk, hogy az If utasítás hatókörét az else utasítás hatókörétől eltér.
Minden, ami az If utasítás és az End If kulcsszó között van, ennek az If utasításnak a hatókörébe tartozik. Más hatókörök is létezhetnek a kódban az olyan ciklusok miatt, mint a For Next loop, Do Until loop vagy For Each Next loop.
Egy hatókör akkor létezik, ha egy logikai utasítás több kulcsszót igényel az utasítás kezdő- és végpontjának jelölésére. Probléma akkor merül fel, ha a hatóköröket olyan módon fedjük át, hogy az egyik részben a másikban helyezkedik el. A helyes módja annak, hogy több hatókör egymással együttműködjön, az, ha az egyik teljesen a másikban helyezkedik el.
A következő példában a If
Then
után egy For
hurok kezdete következik, amelyet a Else
kulcsszó követ. Ez elválasztja az If utasítást és az Else kulcsszót, és ez okozza a hiba megjelenését.
Sub Else_Without_If()x = InputBox("Set x value")'az if utasítás indítása scopeIf x = 1 Then MsgBox "x value is equal to 1" 'egy új scope (For Next loop) For R = 1 To 5'Else kulcsszó elválik az If utasítástól, mert egy másik scope-ban van.Else Next R MsgBox "x értéke nem egyenlő 1 "End IfEnd Sub
A probléma megoldásához biztosítjuk, hogy az If logikai utasítás egésze teljes egészében a For cikluson belül legyen. Vagy a For hurok teljes egészében az If logikai utasításon belül van Action; If és Else között vagy Else és End If között.
Az általános szabály az, hogy ha a kódunk egy szakaszának van egy bizonyos állapota, mivel van egy kezdő és egy befejező pontja (If – Else, Else – End If, For – Next, Do – Until), akkor nem kezdhetünk egy másik szakaszt (scope) azon belül anélkül, hogy az első szakaszon belül befejeznénk.
Kezdési pont (If, Else, For, Do)
Másik kezdőpont
Tegyél valamit
Másik végpont
Végpont (Else, End If, Next, Until)
Hogy ezt a példánkra alkalmazzuk, a következő kódra módosítjuk;
Sub Else_Without_If()x = InputBox("Set x value")'az if utasítás indítása scopeIf x = 1 Then MsgBox "x value is equal to 1" 'új scope indítása (For Next ciklus) For R = 1 To 5 MsgBox "x value is equal to 1" 'az új hatókör befejezése ugyanabban a hatókörben, amelyben elkezdődött Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub
Incorrect If Statement
Példa 3: A művelet elhelyezése az If utasítással egy sorban
Egy másik nagyon gyakori hiba, amit gyakran elkövetnek, hogy az If utasítást úgy írják meg, hogy az nem kompatibilis az Else kulcsszó használatával.
Ha használni akarjuk az Else kulcsszót, akkor az If-Then-Else logika akció részét az if utasítás utáni következő sorban kell elhelyeznünk. Ha nem használjuk az Else kulcsszót, akkor a műveletet az If utasítással azonos sorba helyezhetjük, és nem írjuk ki az Else kulcsszót vagy az End If kulcsszót.
Ha a művelet (amelyet akkor kell végrehajtani, ha a feltétel igaz) az If utasítással azonos sorba kerül, akkor az If utasítás teljesnek tekinthető. Ez az If – then logika rövidített írásmódjának tekinthető.
Ez az oka annak, hogy amikor a fordító ezután egy Else kulcsszóval találkozik, nem talál olyan If utasítást, amely az Else kulcsszóhoz tartozik, mert az az If utasítás befejeződött azzal, hogy a műveletet az If utasítással egy sorba helyezte. A következő kód NEM helyes, és fordítási hibát okoz:
A műveletet (MsgBox "x értéke egyenlő 1"
) az If utasítás utáni következő sorba kell helyezni ahhoz, hogy az If-Then-Else logikában használt Else utasítást használhassuk. Az alábbi kódban az action utasítást áthelyeztük a következő sorba, ami megoldja a problémát.
Most már a fordítási hiba összes lehetséges okát lefedtük: Else nélkül if. Összefoglalva, ha ezt a hibát kapja, ellenőrizze, hogy
1) Van-e olyan If utasítás a helyén, amely megelőzi az Else kulcsszót.
2) Az if utasítás sora nem tartalmaz-e mást, mint If
Then
.
3) Ellenőrizze, hogy az If utasítás és az Else kulcsszó között nincs-e más hatókör vagy szakasz, például ciklus.
Lásd még: Az “End If blokk nélküli If” hiba kijavítása