To, co widzisz, to błąd kompilacji, który wskazuje, że słowo kluczowe Else (lub ElseIf) nie zostało poprzedzone poprawną instrukcją If.
To znaczy, że kompilator znalazł instrukcję Else (którą podświetli dla użytkownika), nie widząc instrukcji If w liniach powyżej. Jest to błąd, ponieważ narusza poprawną składnię instrukcji If-Then-Else. Poprawna składnia jest następująca:
Za użycie skróconej składni instrukcji if, która określa warunek i akcję (gdy warunek jest spełniony):
If
Then
Do użycia standardowej składni instrukcji If, która określa warunek i akcję (dla sytuacji, gdy warunek jest spełniony) oraz alternatywną akcję dla sytuacji, gdy warunek nie jest spełniony:
If
Then
Else
.
End if
Do określania więcej niż jednego warunku (i ich akcji):
If
Then
ElseIf
Then
Else
.
End if
Błąd kompilacji „Else Without If” występuje, gdy „If
Then
” brakuje lub jest napisane niepoprawnie. Omówmy wspólne przyczyny błędu dalej w szczegółach poniżej z przykładami.
Missing If Statement
Gdy kompilator VBA widzi, że słowo kluczowe Else nie jest poprzedzone rozpoznawalną (poprawną) instrukcją If, generuje błąd „Else bez If”. Dla każdego Else musi istnieć instrukcja If. Jednakże, dla każdego If, niekoniecznie potrzebujemy instrukcji else.
Przykład 1: Brakująca instrukcja If
W tym przykładzie, wyświetlamy pole wejściowe, które pobiera dane wejściowe użytkownika i przechowuje je w x. Następnie napotykamy słowo kluczowe Else, ale przed nim nie było instrukcji If. To rzeczywiście spowoduje błąd kompilatora: Else Without If.
Aby rozwiązać ten problem, musimy po prostu dodać instrukcję If. Instrukcja If składa się z If
Then
.
Postępowanie zgodnie z dobrymi praktykami wcięć jest kluczowe dla rozpoznania, czy każda logika if-else-then składa się z niezbędnych słów kluczowych (instrukcja If, słowo kluczowe Else, słowo kluczowe End If).
If
Then
Else
If
Then
. Else
End If
End If
Przykład 2: Else statement is inside a loop and If statement is outside
Możesz być zaskoczony, że dostajesz ten błąd, kiedy masz już instrukcję If obecną w kodzie i umieszczoną przed słowem kluczowym Else i napisaną poprawnie. Problem może nie być widoczny na pierwszy rzut oka. Ale jeśli przyjrzymy się bliżej, zobaczymy, że zakres instrukcji If jest inny niż zakres instrukcji else.
Wszystko pomiędzy instrukcją If a słowem kluczowym End If należy do zakresu tej instrukcji If. Inne zakresy mogą również istnieć w kodzie ze względu na istnienie pętli, takich jak pętla For Next, pętla Do Until lub pętla For Each Next.
Zakres istnieje, gdy instrukcja logiczna wymaga wielu słów kluczowych do wskazania punktów początkowych i końcowych instrukcji. Problem pojawia się, gdy zakresy nakładają się na siebie w sposób, który powoduje, że jeden z nich jest częściowo umieszczony wewnątrz drugiego. Prawidłowym sposobem współpracy wielu zakresów jest całkowite umieszczenie jednego wewnątrz drugiego.
W poniższym przykładzie, If
Then
po którym następuje początek For
pętli, po którym następuje Else
słowo kluczowe. To oddziela instrukcję If od słowa kluczowego Else i powoduje wyświetlenie błędu.
Sub Else_Without_If()x = InputBox("Set x value")'rozpoczęcie instrukcji if scopeIf x = 1 Then MsgBox "wartość x jest równa 1" 'rozpoczęcie nowego zakresu (pętla For Next) For R = 1 To 5'Słowo kluczowe Else jest oddzielone od instrukcji If, ponieważ jest w innym zakresie.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
Aby naprawić problem, upewniamy się, że instrukcja logiczna If jako całość jest w pełni objęta wewnątrz pętli For. Lub pętla For jest w całości objęta instrukcją logiczną If; pomiędzy If i Else lub pomiędzy Else i End If.
Jako ogólna zasada, jeśli sekcja twojego kodu ma pewien status ze względu na posiadanie punktu początkowego i końcowego (If – Else, Else – End If, For – Next, Do – Until) to nie możesz rozpocząć innej sekcji (zakresu) w jej obrębie bez zakończenia jej w obrębie pierwszej sekcji.
Punkt początkowy (If, Else, For, Do)
Kolejny punkt początkowy
Do Something
Kolejny punkt końcowy
Punkt końcowy (Else, End If, Next, Until)
Aby zastosować to do naszego przykładu, zmieniamy go na następujący kod;
Sub Else_Without_If()x = InputBox("Ustaw wartość x")'rozpoczęcie instrukcji if scopeIf x = 1 Then MsgBox "wartość x jest równa 1" 'rozpoczęcie nowego zakresu (pętla For Next) For R = 1 To 5 MsgBox "x value is equal to 1" 'kończąc nowy zakres w tym samym zakresie, w którym został rozpoczęty Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub
Incorrect If Statement
Przykład 3: Umieszczanie akcji w tej samej linii z instrukcją If
Kolejnym bardzo często popełnianym błędem jest pisanie instrukcji If w sposób, który nie jest zgodny z wykorzystaniem słowa kluczowego Else.
Jeśli chcemy użyć słowa kluczowego Else, musimy umieścić część akcji logiki If-Then-Else w następnej linii po instrukcji if. Jeśli nie używamy słowa kluczowego Else, wtedy możemy umieścić akcję w tym samym wierszu co instrukcja If i nie piszemy słowa kluczowego Else ani słowa kluczowego End If.
Gdy akcja (która powinna być wykonana, jeśli warunek jest prawdziwy) jest umieszczona w tym samym wierszu co instrukcja If, wtedy instrukcja If jest uważana za kompletną. Jest to uważane za skrótowy sposób pisania logiki If – then.
Dlatego, gdy kompilator napotyka słowo kluczowe Else po tym, nie znajduje instrukcji If, która należy do słowa kluczowego Else, ponieważ ta instrukcja If została zakończona umieszczeniem akcji w tej samej linii co instrukcja If. Poniższy kod NIE jest poprawny i spowoduje błąd kompilatora: Else bez If.
Akcja (MsgBox "wartość x jest równa 1"
) musi być umieszczona w następnym wierszu po instrukcji If, aby móc mieć instrukcję Else używaną w logice If-Then-Else. W poniższym kodzie, przenieśliśmy instrukcję action do następnego wiersza, co rozwiązuje problem.
Objęliśmy teraz wszystkie możliwe przyczyny błędu kompilacji: Else bez if. Podsumowując, jeśli otrzymasz ten błąd, sprawdź, czy
1) Istnieje instrukcja If, która poprzedza słowo kluczowe Else.
2) Linia instrukcji If nie zawiera niczego innego niż If
Then
.
3) Sprawdź, czy instrukcja If i słowo kluczowe Else nie są oddzielone innym zakresem lub sekcją, taką jak pętle.
Zobacz także: Jak naprawić błąd „End If bez bloku If”
.