Wat u ziet is een compileerfout die aangeeft dat een Else (of ElseIf) keyword niet werd voorafgegaan door een correcte If-instructie.
Dit betekent dat de compiler een Else-instructie heeft gevonden (die hij markeert voor de gebruiker) zonder dat hij een If-instructie zag in de regels erboven. Dit is een fout omdat het in strijd is met de correcte syntaxis van een If-Then-Else statement. De correcte syntaxis is als volgt:
Voor het gebruik van de steno-syntaxis voor een if-instructie waarin een voorwaarde en een actie (voor wanneer aan de voorwaarde is voldaan) worden gespecificeerd:
If
Then
Om de standaardsyntaxis voor een If-instructie te gebruiken die een voorwaarde en een actie specificeert (voor wanneer aan de voorwaarde is voldaan) en een alternatieve actie voor wanneer niet aan de voorwaarde is voldaan:
If
Then
Else
End if
Voor het specificeren van meer dan één voorwaarde (en hun acties):
If
Then
ElseIf
Then
Else
End if
De compilatiefout “Else zonder If” treedt op wanneer “If
Then
” ontbreekt of onjuist geschreven is. Laten we de veel voorkomende oorzaken van de fout hieronder verder in detail bespreken met voorbeelden.
Missing If Statement
Wanneer de VBA compiler ziet dat het Else keyword niet wordt voorafgegaan door een herkenbaar (correct) If statement, genereert het een fout ‘Else zonder If’. Voor elke Else, moet er een If statement zijn. Voor elke If is echter niet per se een else statement nodig.
Voorbeeld 1: Ontbrekende If verklaring
In dit voorbeeld tonen we een invoervak dat de invoer van de gebruiker opneemt en opslaat in x. Dan komen we een Else keyword tegen, maar er ging geen If verklaring aan vooraf. Dit veroorzaakt inderdaad een compilerfout: Else Without If.
Om dit probleem op te lossen, hoeven we alleen maar een If-statement toe te voegen. Een If-instructie bestaat uit If
Then
.
Het volgen van goede inspringpraktijken is van cruciaal belang om te herkennen of elke if-else-then-logica uit de benodigde trefwoorden bestaat (If-instructie, Else-toetswoord, End If-toetswoord).
If
Then
Else
If
Then
Else
End If
End If
Exemplaar 2: Else-instructie in een lus en If-instructie erbuiten
Het zal u misschien verbazen dat u de foutmelding krijgt terwijl de If-instructie al in de code staat en vóór het Else-toetswoord is geplaatst en correct is geschreven. Het probleem is op het eerste gezicht misschien niet duidelijk. Maar als we beter kijken, zullen we zien dat de scope van de If-instructie anders is dan die van de else-instructie.
Alles tussen de If-instructie en het End If-toetswoord behoort tot de scope van deze If-instructie. Andere scopes kunnen ook bestaan in de code door het bestaan van lussen zoals For Next-lus, Do Until-lus of For Each Next-lus.
Een scope bestaat wanneer een logisch statement meerdere sleutelwoorden nodig heeft om de begin- en eindpunten van het statement aan te geven. Er ontstaat een probleem als u scopes op zo’n manier overlapt dat de ene gedeeltelijk binnen de andere komt te liggen. De juiste manier om meerdere scopes met elkaar te laten samenwerken is door de ene volledig binnen de andere te plaatsen.
In het volgende voorbeeld wordt If
Then
gevolgd door het begin van een For
loop gevolgd door het Else
sleutelwoord. Dit scheidt het If statement en het Else keyword en veroorzaakt de fout.
Sub Else_Without_If()x = InputBox("Set x value")'het starten van de if statement scopeIf x = 1 Then MsgBox "x value is equal to 1" 'het starten van een nieuwe scope (For Next loop) For R = 1 To 5'Else keyword is gescheiden van zijn If statement omdat het in een andere scope zit.Else Next R MsgBox "x-waarde is niet gelijk aan 1 "End IfEnd Sub
Om dit probleem op te lossen, moeten we ervoor zorgen dat het logische If-statement in zijn geheel volledig wordt opgenomen in de For-lus. Of de For-lus wordt volledig omsloten door de If logische verklaring Actie; tussen If en Else of tussen Else en End If.
Als algemene regel geldt dat als een deel van je code een bepaalde status heeft doordat het een begin- en eindpunt heeft (If – Else, Else – End If, For – Next, Do – Until), je daarbinnen geen ander deel (scope) kunt beginnen zonder het te laten eindigen binnen het eerste deel.
Beginpunt (If, Else, For, Do)
Een ander beginpunt
Doe iets
Een ander eindpunt
Eindpunt (Else, End If, Next, Until)
Om dit op ons voorbeeld toe te passen, veranderen we het in de volgende code;
Sub Else_Without_If()x = InputBox("Stel x waarde in")'starten van het if statement scopeIf x = 1 Then MsgBox "x waarde is gelijk aan 1" 'starten van een nieuwe scope (For Next loop) For R = 1 To 5 MsgBox "x waarde is gelijk aan 1" 'beëindigen van de nieuwe scope binnen dezelfde scope als waarin hij gestart is Next RElse MsgBox "x waarde is niet gelijk aan 1 "End IfEnd Sub
Incorrect If Statement
Example 3: Plaatsing van de actie op dezelfde regel met If Statement
Een andere veelgemaakte fout is het schrijven van het If statement op een manier die niet compatibel is met het gebruik van het Else keyword.
Als we het Else keyword willen gebruiken, moeten we het actiegedeelte van de If-Then-Else logica in de volgende regel na de if verklaring plaatsen. Als we het Else-toetswoord niet gebruiken, dan kunnen we de actie op dezelfde regel plaatsen als de If-instructie en schrijven we niet het Else-toetswoord of het End If-toetswoord.
Wanneer de actie (die moet worden uitgevoerd als de voorwaarde waar is) op dezelfde regel wordt geplaatst als de If-instructie, dan wordt de If-instructie als voltooid beschouwd. Dit wordt beschouwd als een steno manier om de If – then logica te schrijven.
Daarom vindt de compiler, wanneer hij daarna een Else keyword tegenkomt, geen If statement dat bij het Else keyword hoort, omdat die If statement is voltooid met het plaatsen van de actie op de regel als de If statement. De volgende code is NIET correct en zal de compilerfout veroorzaken: Else zonder If.
De actie (MsgBox "x waarde is gelijk aan 1"
) moet op de volgende rij na het If statement worden geplaatst om een Else statement te kunnen laten gebruiken in de If-Then-Else logica. In de volgende code hebben we het actie statement naar de volgende regel verplaatst, waardoor het probleem is opgelost.
We hebben nu alle mogelijke oorzaken van de compileerfout behandeld: Else zonder if. Om samen te vatten, als je deze fout krijgt, controleer dan of
1) Er is een If statement op zijn plaats dat voorafgaat aan het Else keyword.
2) De if statement regel bevat niets anders dan If
Then
.
3) Controleer of de If statement en de Else keyword niet worden gescheiden door een ander toepassingsgebied of sectie, zoals lussen.
Zie ook: Hoe repareer ik de “End If zonder block If”-fout