Det, du ser, er en kompileringsfejl, der indikerer, at et Else- (eller ElseIf-) nøgleord ikke blev indledt af en korrekt If-angivelse.
Det betyder, at kompileren fandt en Else-angivelse (som den vil fremhæve for brugeren) uden at se en If-angivelse i linjerne over den. Dette er en fejl, fordi det er i strid med den korrekte syntaks for en If-Then-Else-erklæring. Den korrekte syntaks er som følger:
For at bruge den korte syntaks for if-erklæring, der angiver en betingelse og en handling (for når betingelsen er opfyldt):
If
Then
For at bruge standardsyntaksen for en If-erklæring, der angiver en betingelse og en handling (for når betingelsen er opfyldt) og en alternativ handling for når betingelsen ikke er opfyldt:
If
Then
Else
End if
Til angivelse af mere end én betingelse (og deres handlinger):
Hvis
Derpå
ElseHvis
Derpå
Else
End if
Kompileringsfejlen “Else Without If” opstår, når “If
Then
” mangler eller er skrevet forkert. Lad os diskutere de almindelige årsager til fejlen yderligere i detaljer nedenfor med eksempler.
Manglende If-angivelse
Når VBA-kompiler ser, at nøgleordet Else ikke indledes af en genkendelig (korrekt) If-angivelse, genererer den en fejl “Else uden If”. For hver Else skal der være en If-erklæring. Men for hvert If har vi ikke nødvendigvis brug for en else-angivelse.
Eksempel 1: Manglende If-angivelse
I dette eksempel viser vi et indtastningsfelt, der tager brugerens input og gemmer det i x. Derefter støder vi på et Else-keyword, men der var ingen If-angivelse forud for det. Dette vil faktisk medføre en compilerfejl: Else uden If.
For at løse dette problem skal vi blot tilføje en If-erklæring. En If-erklæring består af If
Then
.
Følgelse af god indrykningspraksis er afgørende for at kunne genkende, om hver if-else-then-logik består af de nødvendige nøgleord (If-erklæring, Else-keyword, End If-keyword).
Hvis
Da
Else
Hvis
Da
Else
End If
End If
Eksempel 2: Else-erklæringen er inde i en løkke og If-erklæringen er udenfor
Du er måske overrasket over, at du får fejlen, når du allerede har If-erklæringen i koden og er placeret før Else-keywordet og skrevet korrekt. Problemet er måske ikke umiddelbart synligt ved første øjekast. Men hvis vi ser nærmere efter, vil vi se, at If-erklæringens omfang er anderledes end else-erklæringens.
Alt mellem If-erklæringen og End If-keywordet hører til omfanget af denne If-erklæring. Der kan også eksistere andre scopes i koden på grund af eksistensen af sløjfer som For Next-sløjfen, Do Until-sløjfen eller For Each Next-sløjfen.
Et scope eksisterer, når en logisk erklæring kræver flere nøgleord for at angive start- og slutpunktet for erklæringen. Der opstår et problem, hvis du overlapper scopes på en måde, der gør, at det ene delvist placeres inden for det andet. Den korrekte måde at få flere scopes til at fungere sammen på er, at det ene er helt placeret inden for det andet.
I følgende eksempel er If
Then
efterfulgt af begyndelsen af en For
sløjfe efterfulgt af nøgleordet Else
. Dette adskiller If-erklæringen og Else-keywordet og medfører, at fejlen vises.
Sub Else_Without_If()x = InputBox("Set x value")'starter If-erklæringen scopeIf x = 1 Then MsgBox "x value is equal to 1" 'starter et nyt scope (For Next loop) For R = 1 To 5'Else-keyword er adskilt fra sin If-erklæring, fordi det er i et andet scope.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
For at løse problemet sikrer vi, at den logiske If-angivelse som helhed er fuldt ud omsluttet i For-loopet. Eller For-sløjfen er fuldt omsluttet inden for den logiske If-angivelse Handling; mellem If og Else eller mellem Else og End If.
Som en generel regel gælder det, at hvis et afsnit af din kode har en vis status på grund af at have et start- og slutpunkt (If – Else, Else – End If, For – Next, Do – Until), så kan du ikke starte et andet afsnit (scope) inden for det uden at afslutte det inden for det første afsnit.
Startpunkt (If, Else, For, Do)
Et andet startpunkt
Gør noget
Et andet slutpunkt
Endpunkt (Else, End If, Next, Until)
For at anvende dette på vores eksempel, ændrer vi det til følgende kode;
Sub Else_Without_If()x = InputBox("Indstil x-værdi")'starter if-anvisningen scopeIf x = 1 Then MsgBox "x-værdi er lig med 1" 'starter et nyt scope (For Next-loop) For R = 1 To 5 MsgBox "x værdi er lig med 1" 'afslutter det nye scope inden for det samme scope, som det blev startet i Next RElse MsgBox "x-værdi er ikke lig med 1 "End IfEnd Sub
Incorrect If Statement
Eksempel 3: Placering af handlingen på samme linje som If-erklæringen
En anden meget almindelig fejl, der ofte begås, er at skrive If-erklæringen på en måde, der ikke er kompatibel med brugen af Else-keywordet.
Hvis vi ønsker at bruge Else-keywordet, skal vi placere handlingsdelen af If-Then-Else-logikken i den næste linje efter if-erklæringen. Hvis vi ikke bruger Else-keywordet, kan vi placere handlingen på samme linje som If-erklæringen, og vi skriver ikke Else-keywordet eller End If-keywordet.
Når handlingen (som skal udføres, hvis betingelsen er sand) er placeret på samme linje som If-erklæringen, anses If-erklæringen for at være komplet. Dette betragtes som en kortfattet måde at skrive If – then-logikken på.
Det er derfor, at når compileren støder på et Else-keyword bagefter, finder den ikke en If-angivelse, der hører til Else-keywordet, fordi denne If-angivelse er blevet afsluttet ved at placere handlingen på samme linje som If-angivelsen. Følgende kode er IKKE korrekt og vil medføre fejl i compileren: Else uden If.
Aktionen (MsgBox "x value is equal to 1"
) skal placeres på den næste linje efter If-angivelsen for at kunne få en Else-angivelse anvendt i If-Then-Else-logikken. I den følgende kode har vi flyttet i action-erklæringen til næste linje, hvilket løser problemet.
Vi har nu dækket alle mulige årsager til kompileringsfejl: Else uden if. For at opsummere: Hvis du får denne fejl, skal du kontrollere, om
1) Der er en If-erklæring på plads, der går forud for nøgleordet Else.
2) Linjen med if-erklæringen indeholder ikke andet end If
Then
.
3) Kontroller, at If-erklæringen og nøgleordet Else ikke er adskilt af et andet scope eller afsnit, f.eks. løkker.
Se også: Sådan retter du “End If uden blok If”-fejlen