Was Sie sehen, ist ein Kompilierungsfehler, der anzeigt, dass einem Else (oder ElseIf) Schlüsselwort keine korrekte If-Anweisung vorangestellt wurde.

Das bedeutet, dass der Compiler eine Else-Anweisung gefunden hat (die er für den Benutzer hervorhebt), ohne eine If-Anweisung in den Zeilen darüber zu sehen. Dies ist ein Fehler, weil es gegen die korrekte Syntax einer If-Then-Else-Anweisung verstößt. Die korrekte Syntax lautet wie folgt:

Für die Verwendung der Kurzsyntax für eine If-Anweisung, die eine Bedingung und eine Aktion (für den Fall, dass die Bedingung erfüllt ist) angibt:

Wenn Dann

Zur Verwendung der Standardsyntax für eine If-Anweisung, die eine Bedingung und eine Aktion (für den Fall, dass die Bedingung erfüllt ist) sowie eine alternative Aktion für den Fall, dass die Bedingung nicht erfüllt ist, angibt:

If Dann

Else

Ende wenn

Für die Angabe von mehr als einer Bedingung (und deren Aktionen):

Wenn Dann

ElseWenn Dann

Else

End if

Der Kompilierfehler „Else ohne If“ tritt auf, wenn „If Then “ fehlt oder falsch geschrieben ist. Lassen Sie uns die häufigen Ursachen des Fehlers weiter unten anhand von Beispielen erörtern.

Fehlende If-Anweisung

Wenn der VBA-Compiler sieht, dass dem Else-Schlüsselwort keine erkennbare (korrekte) If-Anweisung vorangestellt ist, erzeugt er den Fehler „Else without If“. Für jedes Else muss es eine If-Anweisung geben. Für jede If-Anweisung brauchen wir aber nicht unbedingt eine else-Anweisung.

Beispiel 1: Fehlende If-Anweisung

In diesem Beispiel zeigen wir ein Eingabefeld an, das die Eingaben des Benutzers entgegennimmt und in x speichert. Dann stoßen wir auf ein Else-Schlüsselwort, dem aber keine If-Anweisung vorausging. Dies führt in der Tat zu einem Compilerfehler: Else ohne If.

Um dieses Problem zu lösen, müssen wir nur eine If-Anweisung hinzufügen. Eine If-Anweisung besteht aus If Then.

Eine gute Einrückungspraxis ist entscheidend, um zu erkennen, ob jede If-Else-Then-Logik aus den erforderlichen Schlüsselwörtern (If-Anweisung, Else-Schlüsselwort, End If-Schlüsselwort) besteht.

Wenn Dann

Else

Wenn Dann

Else

End If

End If

Beispiel 2: Die Else-Anweisung befindet sich innerhalb einer Schleife und die If-Anweisung außerhalb

Sie sind vielleicht überrascht, dass Sie den Fehler erhalten, obwohl die If-Anweisung bereits im Code vorhanden ist und vor dem Else-Schlüsselwort steht und korrekt geschrieben wurde. Das Problem ist vielleicht nicht auf den ersten Blick ersichtlich. Aber wenn wir genauer hinsehen, werden wir feststellen, dass der Geltungsbereich der If-Anweisung ein anderer ist als der der else-Anweisung.

Alles zwischen der If-Anweisung und dem End If-Schlüsselwort gehört zum Geltungsbereich dieser If-Anweisung. Andere Bereiche können im Code auch durch das Vorhandensein von Schleifen wie For Next-Schleife, Do Until-Schleife oder For Each Next-Schleife existieren.

Ein Bereich existiert, wenn eine logische Anweisung mehrere Schlüsselwörter benötigt, um den Start- und Endpunkt der Anweisung anzugeben. Ein Problem tritt auf, wenn Sie Bereiche so überlappen, dass ein Bereich teilweise innerhalb des anderen liegt. Die korrekte Art und Weise, mehrere Bereiche miteinander arbeiten zu lassen, besteht darin, einen vollständig innerhalb des anderen zu platzieren.

Im folgenden Beispiel folgt auf If Then der Beginn einer For Schleife, gefolgt von dem Else Schlüsselwort. Dies trennt die If-Anweisung und das Else-Schlüsselwort und führt dazu, dass der Fehler angezeigt wird.

Sub Else_Ohne_If()x = InputBox("Setze x-Wert")'Beginn der If-Anweisung scopeIf x = 1 Then MsgBox "x-Wert ist gleich 1" 'Beginn eines neuen Bereichs (For Next-Schleife) For R = 1 To 5'Else-Schlüsselwort wird von seiner If-Anweisung getrennt, weil es in einem anderen Bereich liegt.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub

Um das Problem zu beheben, stellen wir sicher, dass die logische If-Anweisung als Ganzes vollständig von der For-Schleife umfasst wird. Oder die For-Schleife ist vollständig in die logische If-Anweisung eingeschlossen; zwischen If und Else oder zwischen Else und End If.

Als allgemeine Regel gilt: Wenn ein Abschnitt Ihres Codes einen bestimmten Status hat, weil er einen Start- und Endpunkt hat (If – Else, Else – End If, For – Next, Do – Until), dann können Sie keinen anderen Abschnitt (Bereich) darin beginnen, ohne ihn im ersten Abschnitt zu beenden.

Startpunkt (If, Else, For, Do)

Anderer Startpunkt

Tue etwas

Anderer Endpunkt

Endpunkt (Else, End If, Next, Until)

Um dies auf unser Beispiel anzuwenden, ändern wir es in den folgenden Code;

Sub Else_Without_If()x = InputBox("Setze x Wert")'Beginn der if Anweisung scopeIf x = 1 Then MsgBox "x Wert ist gleich 1" 'Beginn eines neuen scope (For Next Schleife) For R = 1 To 5 MsgBox "x Wert ist gleich 1" 'Beenden des neuen Bereichs innerhalb desselben Bereichs, in dem er begonnen wurde Next RElse MsgBox "x Wert ist nicht gleich 1 "End IfEnd Sub

Fehlerhafte If-Anweisung

Beispiel 3: Platzierung der Aktion in der gleichen Zeile wie die If-Anweisung

Ein weiterer sehr häufiger Fehler, der oft gemacht wird, ist die If-Anweisung so zu schreiben, dass sie nicht mit der Verwendung des Else-Schlüsselworts vereinbar ist.

Wenn wir das Else-Schlüsselwort verwenden wollen, müssen wir den Aktionsteil der If-Then-Else-Logik in die nächste Zeile nach der If-Anweisung setzen. Wenn wir das Else-Schlüsselwort nicht verwenden, können wir die Aktion in derselben Zeile wie die If-Anweisung platzieren und schreiben weder das Else-Schlüsselwort noch das End If-Schlüsselwort.

Wenn die Aktion (die ausgeführt werden soll, wenn die Bedingung wahr ist) in derselben Zeile wie die If-Anweisung platziert ist, wird die If-Anweisung als vollständig betrachtet. Dies wird als eine Kurzform der If – then Logik angesehen.

Deshalb findet der Compiler, wenn er auf ein Else-Schlüsselwort stößt, keine If-Anweisung, die zum Else-Schlüsselwort gehört, weil diese If-Anweisung mit der Platzierung der Aktion in der gleichen Zeile wie die If-Anweisung abgeschlossen wurde. Der folgende Code ist NICHT korrekt und führt zu einem Compilerfehler: Else ohne If.

Die Aktion (MsgBox "x value is equal to 1") muss in der nächsten Zeile nach der If-Anweisung platziert werden, damit eine Else-Anweisung in der If-Then-Else-Logik verwendet werden kann. Im folgenden Code haben wir die Action-Anweisung in die nächste Zeile verschoben, was das Problem behebt.

Wir haben nun alle möglichen Ursachen für den Kompilierfehler abgedeckt: Else ohne if. Wenn Sie diesen Fehler erhalten, überprüfen Sie, ob

1) eine If-Anweisung vorhanden ist, die dem Else-Schlüsselwort vorausgeht.

2) die if-Anweisungszeile nichts anderes enthält als If Then.

3) Überprüfen Sie, ob die If-Anweisung und das Else-Schlüsselwort nicht durch einen anderen Bereich oder Abschnitt, wie z. B. Schleifen, getrennt sind.

Siehe auch: Wie man den Fehler „End If ohne Block If“ behebt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.