Det du ser är ett kompileringsfel som indikerar att ett Else- (eller ElseIf)-nyckelord inte föregicks av ett korrekt If-uttalande.
Det innebär att kompilatorn hittade ett Else-uttalande (som den kommer att framhäva för användaren) utan att se ett If-uttalande på raderna ovanför det. Detta är ett fel eftersom det bryter mot den korrekta syntaxen för ett If-Then-Else-uttalande. Den korrekta syntaxen är följande:
För att använda den kortfattade syntaxen för if-anvisning som anger ett villkor och en åtgärd (för när villkoret är uppfyllt):
If
Then
För att använda standardsyntaxen för en If-angivelse som anger ett villkor och en åtgärd (för när villkoret är uppfyllt) och en alternativ åtgärd för när villkoret inte är uppfyllt:
If
Then
Else
End if
För att ange mer än ett villkor (och deras åtgärder):
Om
Då
ElseIf
Då
Else
End if
Kompileringsfelet ”Else Without If” uppstår när ”If
Then
” saknas eller är felaktigt skrivet. Låt oss diskutera de vanligaste orsakerna till felet närmare nedan med exempel.
Missing If Statement
När VBA-kompilatorn ser att nyckelordet Else inte föregås av ett igenkännbart (korrekt) If-uttalande genererar den felet ”Else without If”. För varje Else måste det finnas ett If-uttalande. För varje If behöver vi dock inte nödvändigtvis ett else-uttalande.
Exempel 1: Saknat If-uttalande
I det här exemplet visar vi en inmatningsruta som tar emot användarens inmatning och lagrar den i x. Sedan stöter vi på ett Else-nyckelord, men det fanns inget If-uttalande före det. Detta kommer faktiskt att orsaka ett kompileringsfel: För att lösa detta problem behöver vi bara lägga till ett If-uttalande. Ett If-uttalande består av If
Then
.
Följandet av goda indragningsrutiner är avgörande för att kunna känna igen om varje om-som-är-som-logik består av de nödvändiga nyckelorden (If-uttalande, Else-nyckelord, End If-nyckelord).
Om
Då
Else
Om
Då
Else
End If
End If
Exempel 2: Else-angivelsen är inne i en slinga och If-angivelsen är utanför
Du kanske är förvånad över att du får felet när du redan har If-angivelsen i koden och den är placerad före Else-nyckelordet och skriven på rätt sätt. Problemet kanske inte är uppenbart vid första anblicken. Men om vi tittar närmare ser vi att If-angivelsen har en annan räckvidd än else-angivelsen.
Allt mellan If-angivelsen och nyckelordet End If tillhör räckvidden för den här If-angivelsen. Andra räckvidder kan också finnas i koden på grund av förekomsten av slingor såsom For Next-slinga, Do Until-slinga eller For Each Next-slinga.
En räckvidd finns när ett logiskt påstående kräver flera nyckelord för att ange start- och slutpunkterna för påståendet. Ett problem uppstår om du överlappar scope på ett sätt som gör att det ena delvis placeras inuti det andra. Det korrekta sättet att få flera scope att fungera med varandra är att ha ett helt placerat inom det andra.
I följande exempel följs If
Then
av början av en For
slinga följt av nyckelordet Else
. Detta separerar If-anvisningen och Else-nyckelordet och gör att felet visas.
Sub Else_Without_If()x = InputBox("Sätt x-värde")'startar If-anvisningen scopeIf x = 1 Then MsgBox "x-värde är lika med 1" 'startar en ny scope (For Next loop) For R = 1 To 5'Else-nyckelordet separeras från sin If-anvisning eftersom det befinner sig i en annan scope.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
För att åtgärda problemet ser vi till att det logiska If-uttalandet i sin helhet är helt omslutet av For-slingan. Eller att For-slingan är helt omsluten av den logiska If-satsen Action; mellan If och Else eller mellan Else och End If.
Som allmän regel gäller att om ett avsnitt av din kod har en viss status på grund av att det har en start- och slutpunkt (If – Else, Else – End If, For – Next, Do – Until), så kan du inte påbörja ett annat avsnitt (scope) inom det utan att avsluta det inom det första avsnittet.
Startpunkt (If, Else, For, Do)
En annan startpunkt
Gör något
En annan slutpunkt
Endpunkt (Else, End If, Next, Until)
För att applicera detta på vårt exempel ändrar vi det till följande kod;
Sub Else_Without_If()x = InputBox("Sätt x-värde")'startar if-anvisningen scopeIf x = 1 Then MsgBox "x-värde är lika med 1" 'startar en ny scope (For Next-slinga) For R = 1 To 5 MsgBox "x value is equal to 1" 'avslutar det nya området inom samma område som det startades i Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub
Incorrect If Statement
Example 3: Placering av åtgärden på samma rad som If-angivelsen
Ett annat mycket vanligt misstag som ofta görs är att skriva If-angivelsen på ett sätt som inte är kompatibelt med att använda nyckelordet Else.
Om vi vill använda nyckelordet Else måste vi placera åtgärdsdelen av If-Then-Else-logiken på nästa rad efter if-statementet. Om vi inte använder nyckelordet Else kan vi placera åtgärden på samma rad som If-angivelsen och vi skriver inte nyckelordet Else eller nyckelordet End If.
När åtgärden (som ska utföras om villkoret är sant) placeras på samma rad som If-angivelsen anses If-angivelsen vara fullständig. Detta anses vara ett kortfattat sätt att skriva If – then-logiken.
Det är därför som kompilatorn, när den möter ett Else-ord efter detta, inte hittar ett If-uttalande som hör till Else-ordet, eftersom det If-uttalandet har slutförts genom att åtgärden har placerats på samma rad som If-uttalandet. Följande kod är INTE korrekt och kommer att orsaka fel i kompilatorn: Else utan If.
Åtgärden (MsgBox "x value is equal to 1"
) måste placeras på nästa rad efter If-angivelsen för att en Else-angivelse ska kunna användas i If-Then-Else-logiken. I följande kod har vi flyttat in action-anvisningen till nästa rad, vilket löser problemet.
Vi har nu täckt alla möjliga orsaker till kompileringsfelet: Else utan if. För att sammanfatta, om du får det här felet, kontrollera om
1) Det finns en If-angivelse på plats som föregår nyckelordet Else.
2) If-angivelseraden innehåller inte något annat än If
Then
.
3) Kontrollera att If-angivelsen och Else- nyckelordet inte är åtskilda av ett annat tillämpningsområde eller avsnitt, t.ex. slingor.
Se även: Hur du åtgärdar felet ”End If utan block If”