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

ElseIf

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

Else

Om

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”

Lämna ett svar

Din e-postadress kommer inte publiceras.