Fehlermeldungen: Unterschied zwischen den Versionen

Aus VBA-wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 13: Zeile 13:
=== Argumenttyp ByRef unverträglich ===
=== Argumenttyp ByRef unverträglich ===


[[Datei:Fehler_beim_Kompilieren_-_Argumenttyp_ByRef_unverträglich.png]] Wenn die Variable als Kopie übernommen wird (ByVal), dann wandelt VBA den Wert in den erwarteten Datentyp um, sofern dies möglich ist. Wenn eine Variable als Referenz (ByRef) übergeben werden soll, muss der Datentyp übereinstimmen, denn eine automatische Umwandlung findet hier nicht statt. Beispiel: Sub VariantByRef() ' Bei der Deklaration wurde vergessen, den Datentyp anzugeben ' Somit erhält die Variable 'lngNumber' den Datentyp Variant Dim lngNumber, lngValue As Long lngNumber = 2 DoSomething lngNumber ' <- Hier tritt der Fehler auf End Sub ' Bei dieser Prozedur wurde vergessen, den Parameter mit 'ByVal' zu kennzeichnen ' Somit wird keine Kopie des übergebenen Wertes erstellt, sondern die Adresse der ' aufrufenden Variable übergeben. Diese ist aber kein Long-Wert, sondern ein Variant (siehe oben). Sub DoSomething(lngNumber As Long) End Sub
[[Datei:Fehler_beim_Kompilieren_-_Argumenttyp_ByRef_unverträglich.png]]  
 
Wenn die Variable als Kopie übernommen wird (ByVal), dann wandelt VBA den Wert in den erwarteten Datentyp um, sofern dies möglich ist. Wenn eine Variable als Referenz (ByRef) übergeben werden soll, muss der Datentyp übereinstimmen, denn eine automatische Umwandlung findet hier nicht statt. Beispiel: Sub VariantByRef() ' Bei der Deklaration wurde vergessen, den Datentyp anzugeben ' Somit erhält die Variable 'lngNumber' den Datentyp Variant Dim lngNumber, lngValue As Long lngNumber = 2 DoSomething lngNumber ' <- Hier tritt der Fehler auf End Sub ' Bei dieser Prozedur wurde vergessen, den Parameter mit 'ByVal' zu kennzeichnen ' Somit wird keine Kopie des übergebenen Wertes erstellt, sondern die Adresse der ' aufrufenden Variable übergeben. Diese ist aber kein Long-Wert, sondern ein Variant (siehe oben). Sub DoSomething(lngNumber As Long) End Sub


=== Benutzerdefinierter Typ nicht definiert ===
=== Benutzerdefinierter Typ nicht definiert ===


[[Datei:Fehler_beim_Kompilieren_-_Benutzerdefinierter_Typ_nicht_definiert.png]] Neben der offensichtlichen Fehlerquelle (dass der benutzerdefinierte Datentyp tatsächlich nicht definiert wurde) kann dieser Fehler auch auftreten, wenn
[[Datei:Fehler_beim_Kompilieren_-_Benutzerdefinierter_Typ_nicht_definiert.png]]  
 
Neben der offensichtlichen Fehlerquelle (dass der benutzerdefinierte Datentyp tatsächlich nicht definiert wurde) kann dieser Fehler auch auftreten, wenn
* der benutzerdefinierte Typ zwar definiert wurde, aber nicht den benötigten Geltungsbereich hat (zum Beispiel 'Private' definiert wurde statt 'Public')
* der benutzerdefinierte Typ zwar definiert wurde, aber nicht den benötigten Geltungsbereich hat (zum Beispiel 'Private' definiert wurde statt 'Public')
* der benutzerdefnierte Typ nicht, wie vorgeschrieben, im Modulkopf definiert wurde, sondern später im Modul. Beispiel: Option Explicit Sub Procedure01() MsgBox "I will do something!" End Sub Public Type tpePosition Top As Double Left As Double End Type Sub Procedure02(ByRef myPosition As tpePosition) MsgBox "I will do something else..." End Sub Korrekt: Option Explicit Public Type tpePosition Top As Double Left As Double End Type Sub Procedure01() MsgBox "I will do something!" End Sub Sub Procedure02(ByRef myPosition As tpePosition) MsgBox "I will do something else..." End Sub
* der benutzerdefnierte Typ nicht, wie vorgeschrieben, im Modulkopf definiert wurde, sondern später im Modul. Beispiel: Option Explicit Sub Procedure01() MsgBox "I will do something!" End Sub Public Type tpePosition Top As Double Left As Double End Type Sub Procedure02(ByRef myPosition As tpePosition) MsgBox "I will do something else..." End Sub Korrekt: Option Explicit Public Type tpePosition Top As Double Left As Double End Type Sub Procedure01() MsgBox "I will do something!" End Sub Sub Procedure02(ByRef myPosition As tpePosition) MsgBox "I will do something else..." End Sub
Zeile 23: Zeile 27:
=== Benutzerdefinierter Typ ohne Elemente nicht zulässig ===
=== Benutzerdefinierter Typ ohne Elemente nicht zulässig ===


[[Datei:Fehler_beim_Kompilieren_-_Benutzerdefinierter_Typ_ohne_Elemente_nicht_zulässig.png]] Ein Benutzerdefinierter Datentyp 'Type' muss mindestens ein Element enthalten. === Datenfeldargument muß als Referenz (ByRef) übergeben werden=== [[Datei:Fehler_beim_Kompilieren_-_Datenfeldargument_muß_als_Referenz_übergeben_werden.png]] Sie versuchen, einer Prozedur ein Array als Wert zu übergeben (ByVal). Dies ist nicht möglich, denn Arrays können ausschließlich 'ByRef' übergeben werden. Sub Test(byval strAnt() as String) ' Erzeugt den oben genannten Kompilierfehler Beachten Sie jedoch bei der Übergabe als Referenz folgendes: [[Variablen#Übergabeparameter|Variablen: Übergabeparameter]]
[[Datei:Fehler_beim_Kompilieren_-_Benutzerdefinierter_Typ_ohne_Elemente_nicht_zulässig.png]]  
 
Ein Benutzerdefinierter Datentyp 'Type' muss mindestens ein Element enthalten. === Datenfeldargument muß als Referenz (ByRef) übergeben werden=== [[Datei:Fehler_beim_Kompilieren_-_Datenfeldargument_muß_als_Referenz_übergeben_werden.png]]  
 
Sie versuchen, einer Prozedur ein Array als Wert zu übergeben (ByVal). Dies ist nicht möglich, denn Arrays können ausschließlich 'ByRef' übergeben werden.  
 
Sub Test(byval strAnt() as String)         ' Erzeugt den oben genannten Kompilierfehler Beachten Sie jedoch bei der Übergabe als Referenz folgendes: [[Variablen#Übergabeparameter|Variablen: Übergabeparameter]]


=== Erwartet: ) ===
=== Erwartet: ) ===


[[Datei:Fehler_beim_Kompilieren_-_Erwartet_Klammer_zu.png]] Diese Fehlermeldung erscheint in folgenden Situationen:
[[Datei:Fehler_beim_Kompilieren_-_Erwartet_Klammer_zu.png]]  
* Funktionen dürfen keine statischen Arrays zurückgeben (siehe [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]]): Private Function LoadData() As String(3) ' Falsch! Private Function LoadData() As String() ' Richtig ...
 
Diese Fehlermeldung erscheint in folgenden Situationen:
* Funktionen dürfen keine statischen Arrays zurückgeben (siehe [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]]):  
 
Private Function LoadData() As String(3)   ' Falsch!  
Private Function LoadData() As String()     ' Richtig ...


=== Funktionsaufruf auf der linken Seite der Zuweisung muss den Typ Variant oder Object zurückgeben ===
=== Funktionsaufruf auf der linken Seite der Zuweisung muss den Typ Variant oder Object zurückgeben ===


[[Datei:Fehler_beim_Kompilieren_-_Funktionsaufruf_auf_der_linken_Seite_der_Zuweisung.png]] Dieser Fehler tritt auf, wenn Sie eine Funktion verwenden, die ein Array als Rückgabewert hat und dann versuchen, der Funktionsvariablen direkt einen Wert zuzuweisen. Function LoadNames() As String() ReDim LoadNames(4) ' klappt LoadNames(0) = "Peter" ' klappt nicht!!! End Function In diesem Fall muss eine Rückgabevariable verwendet werden, welche gefüllt und am Ende erst in die Funktionsvariable übergeben wird: Function LoadNames() As String() Dim strReturn() As String ReDim strReturn(4) strReturn(0) = "Peter" ' ... LoadNames = strReturn End Function Siehe auch [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]]
[[Datei:Fehler_beim_Kompilieren_-_Funktionsaufruf_auf_der_linken_Seite_der_Zuweisung.png]]  
 
Dieser Fehler tritt auf, wenn Sie eine Funktion verwenden, die ein Array als Rückgabewert hat und dann versuchen, der Funktionsvariablen direkt einen Wert zuzuweisen.  
 
Function LoadNames() As String()  
    ReDim LoadNames(4)     ' klappt  
    LoadNames(0) = "Peter" ' klappt nicht!!!  
End Function  
 
In diesem Fall muss eine Rückgabevariable verwendet werden, welche gefüllt und am Ende erst in die Funktionsvariable übergeben wird:  
 
Function LoadNames() As String()  
    Dim strReturn() As String  
    ReDim strReturn(4)  
    strReturn(0) = "Peter" ' ...  
    LoadNames = strReturn  
End Function  
 
Siehe auch [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]]


=== Keine Zuweisung an Datenfeld möglich ===
=== Keine Zuweisung an Datenfeld möglich ===


[[Datei:Fehler_beim_Kompilieren_-_Keine_Zuweisung_an_Datenfeld_möglich.png]] Tritt im Zusammenhang mit [[Array|Arrays]] auf:
[[Datei:Fehler_beim_Kompilieren_-_Keine_Zuweisung_an_Datenfeld_möglich.png]]  
 
Tritt im Zusammenhang mit [[Array|Arrays]] auf:
* Sie versuchen, ein Array in ein anderes zu übernehmen, welches nicht den gleichen Datentyp hat. Bei einfachen Datentypen wäre dies möglich, Arrays kann VBA jedoch nicht in andere Datentypen umwandeln: Dim strTexts() As String, lngNumbers() As Long strTexts = lngNumbers
* Sie versuchen, ein Array in ein anderes zu übernehmen, welches nicht den gleichen Datentyp hat. Bei einfachen Datentypen wäre dies möglich, Arrays kann VBA jedoch nicht in andere Datentypen umwandeln: Dim strTexts() As String, lngNumbers() As Long strTexts = lngNumbers
* Sie versuchen, zwei unterschiedlich dimensionierte statische Arrays ineinander zu übernehmen: Dim strStatic1(8) As String, strStatic2(5) As String strStatic1 = strStatic2
* Sie versuchen, zwei unterschiedlich dimensionierte statische Arrays ineinander zu übernehmen: Dim strStatic1(8) As String, strStatic2(5) As String strStatic1 = strStatic2
Zeile 43: Zeile 80:
=== Mehrdeutiger Name ===
=== Mehrdeutiger Name ===


[[Datei:Fehler_beim_Kompilieren_-_Mehrdeutiger_Name.png]] Wahrscheinlich wurden mehrere Prozeduren mit dem gleichen Namen angelegt.
[[Datei:Fehler_beim_Kompilieren_-_Mehrdeutiger_Name.png]]  
 
Wahrscheinlich wurden mehrere Prozeduren mit dem gleichen Namen angelegt.


=== Mehrfachdeklaration im aktuellen Gültigkeitsbereich ===
=== Mehrfachdeklaration im aktuellen Gültigkeitsbereich ===


[[Datei:Fehler_beim_Kompilieren_-_Mehrfachdeklaration_im_aktuellen_Gültigkeitsbereich.png]] Sie haben zwei Variablen innerhalb einer Prozedur gleich benannt oder eine schon deklarierte Variable noch einmal deklariert: Sub DuplicateDeclaration() Dim strVariable As String ' ..... Dim strVariable As String ' ..... End Sub
[[Datei:Fehler_beim_Kompilieren_-_Mehrfachdeklaration_im_aktuellen_Gültigkeitsbereich.png]]  
 
Sie haben zwei Variablen innerhalb einer Prozedur gleich benannt oder eine schon deklarierte Variable noch einmal deklariert:  
 
Sub DuplicateDeclaration()  
    Dim strVariable As String  
    ' .....  
    Dim strVariable As String  
 
    ' .....  
 
End Sub


=== Nach End Sub, End Function oder End Property können nur Kommentare stehen ===
=== Nach End Sub, End Function oder End Property können nur Kommentare stehen ===


[[Datei:Fehler_beim_Kompilieren_-_Nach_End_Sub,_End_Function_oder_End_Property_können_nur_Kommentare_stehen.png]] Dieser Fehler tritt zum Beispiel in folgender Situation auf, in der ein 'Type' nach einer Prozedur definiert wurde: Option Explicit Sub Procedure01() MsgBox "I will do something!" End Sub Public Type tpePosition Top As Double Left As Double End Type Korrekt: Benutzerdefinierte Datentypen ('Type') müssen im Modulkopf definiert werden! Option Explicit Public Type tpePosition Top As Double Left As Double End Type Sub Procedure01() MsgBox "I will do something!" End Sub
[[Datei:Fehler_beim_Kompilieren_-_Nach_End_Sub,_End_Function_oder_End_Property_können_nur_Kommentare_stehen.png]]  
 
Dieser Fehler tritt zum Beispiel in folgender Situation auf, in der ein 'Type' nach einer Prozedur definiert wurde:  
 
Option Explicit  
Sub Procedure01()  
    MsgBox "I will do something!"  
End Sub  
Public Type tpePosition
    Top As Double  
    Left As Double  
End Type  
 
Korrekt: Benutzerdefinierte Datentypen ('Type') müssen im Modulkopf definiert werden!  
 
Option Explicit  
Public Type tpePosition  
    Top As Double  
    Left As Double  
End Type Sub  
Procedure01()  
    MsgBox "I will do something!"  
End Sub


=== Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden ===
=== Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden ===
Zeile 63: Zeile 141:
=== Objekt erforderlich ===
=== Objekt erforderlich ===


[[Datei:Fehler_beim_Kompilieren_-_Objekt_erforderlich.png]] Beispiel: Dim strText As String '''Set''' strText = "Hallo!" muss korrekt lauten: Dim strText As String strText = "Hallo!" denn das Schlüsselwort 'Set' darf ausschließlich bei Objektvariablen verwendet werden!
[[Datei:Fehler_beim_Kompilieren_-_Objekt_erforderlich.png]]  
 
Beispiel: Dim strText As String '''Set''' strText = "Hallo!" muss korrekt lauten: Dim strText As String strText = "Hallo!" denn das Schlüsselwort 'Set' darf ausschließlich bei Objektvariablen verwendet werden!


=== Steuervariable für For Each muß vom Typ Variant oder Object sein ===
=== Steuervariable für For Each muß vom Typ Variant oder Object sein ===


[[Datei:Fehler_beim_Kompilieren_-_Steuervariable_für_For_Each_muß_vom_Typ_Variant_oder_Object_sein.png]] Tritt in dieser Situation auf: '''Dim strText As String''' Dim col As Collection Set col = New Collection col.Add "Eins" col.Add "Zwei" '''For Each strText In col''' Debug.Print strText Next strText Die [[Schleifen#For Each|'For Each'-Schleife]] erlaubt es nicht, dass die Steuervariable 'strText' vom Typ 'String' ist. Sie müsste in diesem Fall vom Typ 'Variant' sein. Oder Sie ersetzen die 'For Each'-Schleife durch eine passende 'For'-Schleife: '''Dim lngIndex As Long''' Dim col As Collection Set col = New Collection col.Add "Eins" col.Add "Zwei" '''For lngIndex = 1 To col.Count''' Debug.Print col.Item(lngIndex) Next lngIndex
[[Datei:Fehler_beim_Kompilieren_-_Steuervariable_für_For_Each_muß_vom_Typ_Variant_oder_Object_sein.png]]  
 
Tritt in dieser Situation auf: '''Dim strText As String''' Dim col As Collection Set col = New Collection col.Add "Eins" col.Add "Zwei" '''For Each strText In col''' Debug.Print strText Next strText Die [[Schleifen#For Each|'For Each'-Schleife]] erlaubt es nicht, dass die Steuervariable 'strText' vom Typ 'String' ist. Sie müsste in diesem Fall vom Typ 'Variant' sein. Oder Sie ersetzen die 'For Each'-Schleife durch eine passende 'For'-Schleife: '''Dim lngIndex As Long''' Dim col As Collection Set col = New Collection col.Add "Eins" col.Add "Zwei" '''For lngIndex = 1 To col.Count''' Debug.Print col.Item(lngIndex) Next lngIndex


=== Sub oder Function nicht definiert ===
=== Sub oder Function nicht definiert ===


[[Datei:Fehler_beim_Kompilieren_-_Sub_oder_Function_nicht_definiert.png]] Überprüfen Sie die Schreibweise des Befehls. Kürzen Sie den Befehl gegebenenfalls und verwenden Sie 'Strg+Leertaste', um den Befehl vom VBA-Editor korrekt vervollständigen zu lassen. Diese Fehlermeldung tritt auch dann auf, wenn der Befehl zwar korrekt geschrieben, aber von diesem Modul aus nicht erreichbar ist (siehe [[Prozeduren#Geltungsbereich|Prozeduren: Geltungsbereich]]).
[[Datei:Fehler_beim_Kompilieren_-_Sub_oder_Function_nicht_definiert.png]]  
 
Überprüfen Sie die Schreibweise des Befehls. Kürzen Sie den Befehl gegebenenfalls und verwenden Sie 'Strg+Leertaste', um den Befehl vom VBA-Editor korrekt vervollständigen zu lassen. Diese Fehlermeldung tritt auch dann auf, wenn der Befehl zwar korrekt geschrieben, aber von diesem Modul aus nicht erreichbar ist (siehe [[Prozeduren#Geltungsbereich|Prozeduren: Geltungsbereich]]).


=== Syntaxfehler ===
=== Syntaxfehler ===


[[Datei:Fehler_beim_Kompilieren_-_Syntaxfehler.png]] Syntaxfehler sind mit Rechtschreib- bzw. Grammatikfehlern vergleichbar: Entweder ein Befehl wurde falsch geschrieben oder der Befehlsaufbau stimmt nicht mit den Vorgaben überein. Syntaxfehler treten häufig in folgenden Situationen auf:
[[Datei:Fehler_beim_Kompilieren_-_Syntaxfehler.png]]  
 
Syntaxfehler sind mit Rechtschreib- bzw. Grammatikfehlern vergleichbar: Entweder ein Befehl wurde falsch geschrieben oder der Befehlsaufbau stimmt nicht mit den Vorgaben überein. Syntaxfehler treten häufig in folgenden Situationen auf:
{| class="wikitable"  
{| class="wikitable"  
|-
|-
Zeile 133: Zeile 219:
=== Unzulässige Verwendung einer Eigenschaft ===
=== Unzulässige Verwendung einer Eigenschaft ===


[[Datei:Fehler_beim_Kompilieren_-_Unzulässige_Verwendung_einer_Eigenschaft.png]] Dieser Fehler tritt auf, wenn Sie eine Eigenschaft aufrufen, aber weder den Wert abfragen noch diesen setzen: rngCell.Font.Bold <span style="Color:green">' Erzeugt den Fehler</span> muss vollständig lauten: rngCell.Font.Bold = True <span style="Color:green">' Wenn der Text fett dargestellt werden soll</span> oder blnBold = rngCell.Font.Bold <span style="Color:green">' Wenn Sie wissen möchten, ob der Text fett formatiert ist</span> Der Fehler wird ebenfalls hier erzeugt: If colCollection = Nothing Then Exit Sub muss lauten: If colCollection Is Nothing Then Exit Sub
[[Datei:Fehler_beim_Kompilieren_-_Unzulässige_Verwendung_einer_Eigenschaft.png]]  
 
Dieser Fehler tritt auf, wenn Sie eine Eigenschaft aufrufen, aber weder den Wert abfragen noch diesen setzen: rngCell.Font.Bold <span style="Color:green">' Erzeugt den Fehler</span> muss vollständig lauten: rngCell.Font.Bold = True <span style="Color:green">' Wenn der Text fett dargestellt werden soll</span> oder blnBold = rngCell.Font.Bold <span style="Color:green">' Wenn Sie wissen möchten, ob der Text fett formatiert ist</span> Der Fehler wird ebenfalls hier erzeugt: If colCollection = Nothing Then Exit Sub muss lauten: If colCollection Is Nothing Then Exit Sub


=== Unzulässige Verwendung eines Objekts ===
=== Unzulässige Verwendung eines Objekts ===
Zeile 159: Zeile 247:
=== Variable oder Prozedur anstelle eines Moduls erwartet ===
=== Variable oder Prozedur anstelle eines Moduls erwartet ===


[[Datei:Fehler_beim_Kompilieren_-_Variable_oder_Prozedur_anstelle_eines_Moduls_erwartet.png]] Wahrscheinlich enthält das aktuelle Projekt ein Modul und eine Prozedur mit dem selben Namen. Grundsätzlich ist dies möglich, aber wenn Sie versuchen, aus einem anderen Modul heraus die Prozedur aufzurufen, tritt dieser Fehler auf, weil nun nicht klar ist, ob die Prozedur oder das Modul gemeint ist. Dieser Fehler tritt außerdem auf, wenn Sie einem Modul den Namen einer eingebauten Prozedur (zum Beispiel 'Replace') geben. '''Lösung:''' Fügen Sie Modulnamen ein 'mod' vorne an, damit sich Modulnamen deutlich von Prozedurnamen unterscheiden. ;Beispiele:
[[Datei:Fehler_beim_Kompilieren_-_Variable_oder_Prozedur_anstelle_eines_Moduls_erwartet.png]]  
 
Wahrscheinlich enthält das aktuelle Projekt ein Modul und eine Prozedur mit dem selben Namen. Grundsätzlich ist dies möglich, aber wenn Sie versuchen, aus einem anderen Modul heraus die Prozedur aufzurufen, tritt dieser Fehler auf, weil nun nicht klar ist, ob die Prozedur oder das Modul gemeint ist. Dieser Fehler tritt außerdem auf, wenn Sie einem Modul den Namen einer eingebauten Prozedur (zum Beispiel 'Replace') geben. '''Lösung:''' Fügen Sie Modulnamen ein 'mod' vorne an, damit sich Modulnamen deutlich von Prozedurnamen unterscheiden. ;Beispiele:
* Das Modul 'CalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier tritt der Fehler auf, wenn aus einem anderen Modul heraus 'CalculateSomething' aufgerufen wird.
* Das Modul 'CalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier tritt der Fehler auf, wenn aus einem anderen Modul heraus 'CalculateSomething' aufgerufen wird.
* Das Modul ''''mod'''CalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier gibt es keinen Konflikt und keine Fehlermeldung.
* Das Modul ''''mod'''CalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier gibt es keinen Konflikt und keine Fehlermeldung.
Zeile 169: Zeile 259:
=== 6: Überlauf ===
=== 6: Überlauf ===


[[Datei:Laufzeitfehler_6_-_Überlauf.png]] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[Datei:Laufzeitfehler_6_-_Überlauf_2.png]] Dieser Fehler tritt auf,
[[Datei:Laufzeitfehler_6_-_Überlauf.png]] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[Datei:Laufzeitfehler_6_-_Überlauf_2.png]]  
 
Dieser Fehler tritt auf,
* wenn Sie einer ganzzahligen Variablen einen zu großen Wert zuweisen.
* wenn Sie einer ganzzahligen Variablen einen zu großen Wert zuweisen.
* wenn Sie Null durch Null teilen ( 0 / 0 ).
* wenn Sie Null durch Null teilen ( 0 / 0 ).
Zeile 175: Zeile 267:
=== 9: Index außerhalb des gültigen Bereichs ===
=== 9: Index außerhalb des gültigen Bereichs ===


[[Datei:Laufzeitfehler_9_-_Index_außerhalb_des_gültigen_Bereichs.png]] Tritt zum Beispiel dann auf, wenn Sie versuchen, auf ein nicht existierendes Element einer Collection zuzugreifen.
[[Datei:Laufzeitfehler_9_-_Index_außerhalb_des_gültigen_Bereichs.png]]  
 
Tritt zum Beispiel dann auf, wenn Sie versuchen, auf ein nicht existierendes Element einer Collection zuzugreifen.


=== 11: Division durch Null ===
=== 11: Division durch Null ===


[[Datei:Laufzeitfehler_11_-_Division_durch_Null.png]] Ein typischer Laufzeitfehler tritt bei dem Versuch auf, eine Zahl durch Null zu teilen. Ob eine Division möglich ist, wird erst dann geprüft, wenn die beiden Werte bekannt sind, also zur Laufzeit.
[[Datei:Laufzeitfehler_11_-_Division_durch_Null.png]]  
 
Ein typischer Laufzeitfehler tritt bei dem Versuch auf, eine Zahl durch Null zu teilen. Ob eine Division möglich ist, wird erst dann geprüft, wenn die beiden Werte bekannt sind, also zur Laufzeit.


=== 13: Typen unverträglich ===
=== 13: Typen unverträglich ===


[[Datei:Laufzeitfehler_13_-_Typen_unverträglich.png]] Sie versuchen wahrscheinlich, einer Prozedur einen Wert zu übergeben, der nicht erwartet wird bzw. nicht in den erwarteten Wert umgewandelt werden kann. Ein typischer Fall könnte sein, dass Sie einen Text übergeben, obwohl eine Zahl erwartet wird. Dies mag in vielen Fällen klappen (wenn der Text automatisch in eine Zahl umgewandelt werden kann), aber in genau diesem Fall (zur Laufzeit) eben nicht. Option Explicit Private lngSum As Long ' Modul-Variable merkt sich die Summe Private Function AddValue(ByVal lngValue As Long) lngSum = lngSum + lngValue ' Der übergebene Wert wird zur Modul-Variable addiert End Function AddValue 12 ' Korrekter Aufruf: Zahl wird erwartet AddValue "12" ' Geduldeter Aufruf: Die Zeichenkette "12" kann in die Zahl 12 umgewandelt werden AddValue "Max" ' Fehler: Die Zeichenkette "Max" kann NICHT in Zahl umgewandelt werden Bitte beachten: Dieser Fehler wird auch in folgender Situation angezeigt: lngValue = CLng("Max") Der Fehler 'Typen unverträglich' ist in diesem Falle irreführend, weil die Übergabe einer Zeichenkette durchaus erlaubt ist, der Text 'Max' jedoch nicht in eine Zahl umgewandelt werden kann ...
[[Datei:Laufzeitfehler_13_-_Typen_unverträglich.png]]  
 
Sie versuchen wahrscheinlich, einer Prozedur einen Wert zu übergeben, der nicht erwartet wird bzw. nicht in den erwarteten Wert umgewandelt werden kann. Ein typischer Fall könnte sein, dass Sie einen Text übergeben, obwohl eine Zahl erwartet wird. Dies mag in vielen Fällen klappen (wenn der Text automatisch in eine Zahl umgewandelt werden kann), aber in genau diesem Fall (zur Laufzeit) eben nicht. Option Explicit Private lngSum As Long ' Modul-Variable merkt sich die Summe Private Function AddValue(ByVal lngValue As Long) lngSum = lngSum + lngValue ' Der übergebene Wert wird zur Modul-Variable addiert End Function AddValue 12 ' Korrekter Aufruf: Zahl wird erwartet AddValue "12" ' Geduldeter Aufruf: Die Zeichenkette "12" kann in die Zahl 12 umgewandelt werden AddValue "Max" ' Fehler: Die Zeichenkette "Max" kann NICHT in Zahl umgewandelt werden Bitte beachten: Dieser Fehler wird auch in folgender Situation angezeigt: lngValue = CLng("Max") Der Fehler 'Typen unverträglich' ist in diesem Falle irreführend, weil die Übergabe einer Zeichenkette durchaus erlaubt ist, der Text 'Max' jedoch nicht in eine Zahl umgewandelt werden kann ...


=== 28: Nicht genügend Stapelspeicher ===
=== 28: Nicht genügend Stapelspeicher ===


[[Datei:Laufzeitfehler_28_-_Nicht_genügend_Stapelspeicher.png]] Bei jedem Aufruf einer Prozedur wird auf dem Stapelspeicher eine Art Marke hinterlassen, damit der Programmablauf nach Beendigung der Prozedur zur aufrufenden Prozedur zurückkehren und den Programmablauf weiter verfolgen kann. Wenn der dafür bereitgestellte Platz nicht ausreicht, wird dieser Fehler angezeigt. Der Fehler kann also auftreten, wenn Sie eine zu tiefe Verschachtelung von Prozeduren haben (A ruft B auf, B ruft C auf, C ruft D auf etc.) oder wenn Sie eine Endlos-Rekursion erzeugt haben (siehe [[Kontrollstrukturen#Rekursion|Kontrollstrukturen: Rekursion]]).
[[Datei:Laufzeitfehler_28_-_Nicht_genügend_Stapelspeicher.png]]  
 
Bei jedem Aufruf einer Prozedur wird auf dem Stapelspeicher eine Art Marke hinterlassen, damit der Programmablauf nach Beendigung der Prozedur zur aufrufenden Prozedur zurückkehren und den Programmablauf weiter verfolgen kann. Wenn der dafür bereitgestellte Platz nicht ausreicht, wird dieser Fehler angezeigt. Der Fehler kann also auftreten, wenn Sie eine zu tiefe Verschachtelung von Prozeduren haben (A ruft B auf, B ruft C auf, C ruft D auf etc.) oder wenn Sie eine Endlos-Rekursion erzeugt haben (siehe [[Kontrollstrukturen#Rekursion|Kontrollstrukturen: Rekursion]]).


=== 53: Datei nicht gefunden ===
=== 53: Datei nicht gefunden ===
Zeile 198: Zeile 298:
=== 91: Objekt oder With-Blockvariable nicht festgelegt ===
=== 91: Objekt oder With-Blockvariable nicht festgelegt ===


[[Datei:Laufzeitfehler_91_-_Objekt_oder_With-Blockvariable_nicht_festgelegt.png]] Tritt auf, wenn Sie versuchen, ein Objekt zu verwenden, bevor es mit 'Set' instanziiert wurde. Dim colCollection As Collection colCollection.Add "Test Korrekt: Dim colCollection As Collection '''Set colCollection = New Collection''' colCollection.Add "Test"
[[Datei:Laufzeitfehler_91_-_Objekt_oder_With-Blockvariable_nicht_festgelegt.png]]  
 
Tritt auf, wenn Sie versuchen, ein Objekt zu verwenden, bevor es mit 'Set' instanziiert wurde. Dim colCollection As Collection colCollection.Add "Test Korrekt: Dim colCollection As Collection '''Set colCollection = New Collection''' colCollection.Add "Test"


=== 424: Objekt erforderlich ===
=== 424: Objekt erforderlich ===


[[Datei:Laufzeitfehler_424_-_Objekt_erforderlich.png]] Neben den in der Hilfe aufgeführten Gründen (z.&nbsp;B. der Zugriff auf eine Eigenschaft ohne Angabe des Objektqualifizierers) kann diese Fehlermeldung auch in Situationen wie dieser auftreten: ActiveCell.Left = 34 Die 'Left'-Eigenschaft einer Zelle kann nur abgefragt, aber nicht gesetzt werden, denn sie ist schreibgeschützt.
[[Datei:Laufzeitfehler_424_-_Objekt_erforderlich.png]]  
 
Neben den in der Hilfe aufgeführten Gründen (z.&nbsp;B. der Zugriff auf eine Eigenschaft ohne Angabe des Objektqualifizierers) kann diese Fehlermeldung auch in Situationen wie dieser auftreten: ActiveCell.Left = 34 Die 'Left'-Eigenschaft einer Zelle kann nur abgefragt, aber nicht gesetzt werden, denn sie ist schreibgeschützt.


=== 429: Objekterstellung durch ActiveX-Komponente nicht möglich ===
=== 429: Objekterstellung durch ActiveX-Komponente nicht möglich ===


[[Datei:Laufzeitfehler_429_-_Objekterstellung_durch_ActiveX-Komponente_nicht_möglich.png]] Dieser Fehler tritt auf, wenn Sie versuchen, mit 'GetObject' auf eine Anwendung zuzugreifen, die nicht läuft. Siehe [[Fernsteuerung]].
[[Datei:Laufzeitfehler_429_-_Objekterstellung_durch_ActiveX-Komponente_nicht_möglich.png]]  
 
Dieser Fehler tritt auf, wenn Sie versuchen, mit 'GetObject' auf eine Anwendung zuzugreifen, die nicht läuft. Siehe [[Fernsteuerung]].


=== 457: Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet ===
=== 457: Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet ===


[[Datei:Laufzeitfehler_457_-_Dieser_Schlüssel_ist_bereits_einem_Element_der_Auflistung_zugeordnet.png]] Tritt auf, wenn Sie versuchen, einer Auflistung (Collection) ein weiteres Element mit einem schon verwendeten Schlüssel zu vergeben. Dim colCollection As Collection Set colCollection = New Collection colCollection.Add "Test", "test" colCollection.Add "Prüfung", "test"
[[Datei:Laufzeitfehler_457_-_Dieser_Schlüssel_ist_bereits_einem_Element_der_Auflistung_zugeordnet.png]]  
 
Tritt auf, wenn Sie versuchen, einer Auflistung (Collection) ein weiteres Element mit einem schon verwendeten Schlüssel zu vergeben. Dim colCollection As Collection Set colCollection = New Collection colCollection.Add "Test", "test" colCollection.Add "Prüfung", "test"


=== 1004: Anwendungs- oder objektdefinierter Fehler ===
=== 1004: Anwendungs- oder objektdefinierter Fehler ===


[[Datei:Laufzeitfehler_1004_-_Anwenungs_oder_objektdefinierter_Fehler.png]] Tritt zum Beispiel auf, wenn Sie versuchen, auf ein nicht vorhandenes Element einer Auflistung zuzugreifen Cells(1, 0) ' Die Spalte mit dem Index 0 gibt es in Excel nicht! Range("H2", 34) ' Der Bereich von der Zelle 'H2' bis '34' kann nicht gebildet werden ...
[[Datei:Laufzeitfehler_1004_-_Anwenungs_oder_objektdefinierter_Fehler.png]]  
 
Tritt zum Beispiel auf, wenn Sie versuchen, auf ein nicht vorhandenes Element einer Auflistung zuzugreifen Cells(1, 0) ' Die Spalte mit dem Index 0 gibt es in Excel nicht! Range("H2", 34) ' Der Bereich von der Zelle 'H2' bis '34' kann nicht gebildet werden ...


=== 1004: Dieser Name wird bereits verwendet. Verwenden Sie einen anderen. ===
=== 1004: Dieser Name wird bereits verwendet. Verwenden Sie einen anderen. ===


[[Datei:Laufzeitfehler_1004_-_Dieser_Name_wird_bereits_verwendet.png]] Erscheint, wenn in Excel ein Arbeitsblatt umbenannt werden soll und es existiert bereits ein Arbeitsblatt mit dem Namen.
[[Datei:Laufzeitfehler_1004_-_Dieser_Name_wird_bereits_verwendet.png]]  
 
Erscheint, wenn in Excel ein Arbeitsblatt umbenannt werden soll und es existiert bereits ein Arbeitsblatt mit dem Namen.


=== 5941: Das angeforderte Element ist nicht in der Sammlung vorhanden ===
=== 5941: Das angeforderte Element ist nicht in der Sammlung vorhanden ===


[[Datei:Laufzeitfehler_5941_-_Das_angeforderte_Element_ist_nicht_in_der_Sammlung_vorhanden.png]] Tritt auf, wenn Sie auf ein Element einer Auflistung zugreifen möchten, welches nicht vorhanden ist. ActiveDocument.Tables(1).AllowAutoFit = True ' Dokument enthält keine Tabelle ActiveDocument.FormFields.Item("txtNone").Result ' Formularfeld 'txtNone' existiert nicht
[[Datei:Laufzeitfehler_5941_-_Das_angeforderte_Element_ist_nicht_in_der_Sammlung_vorhanden.png]]  
 
Tritt auf, wenn Sie auf ein Element einer Auflistung zugreifen möchten, welches nicht vorhanden ist. ActiveDocument.Tables(1).AllowAutoFit = True ' Dokument enthält keine Tabelle ActiveDocument.FormFields.Item("txtNone").Result ' Formularfeld 'txtNone' existiert nicht


== Sonstige Fehler ==
== Sonstige Fehler ==
Zeile 230: Zeile 344:
==== Nach diesem Vorgang wird das Projekt zurückgesetzt ====
==== Nach diesem Vorgang wird das Projekt zurückgesetzt ====


[[Datei:Nach_diesem_Vorgang_wird_das_Projekt_zurückgesetzt.png]] Diese Fehlermeldung erscheint häufig, wenn Sie während der Fehlersuche beim schrittweisen Ausführen eine Änderung an der Programmierung vornehmen, welche die weitere Ausführung unterbrechen wird. '''Wichtig:''' Wenn Sie hier nicht mir 'OK' bestätigen, dass Sie trotzdem fortfahren möchten, werden Ihre letzen Änderungen rückgängig gemacht!
[[Datei:Nach_diesem_Vorgang_wird_das_Projekt_zurückgesetzt.png]]  
 
Diese Fehlermeldung erscheint häufig, wenn Sie während der Fehlersuche beim schrittweisen Ausführen eine Änderung an der Programmierung vornehmen, welche die weitere Ausführung unterbrechen wird. '''Wichtig:''' Wenn Sie hier nicht mir 'OK' bestätigen, dass Sie trotzdem fortfahren möchten, werden Ihre letzen Änderungen rückgängig gemacht!


==== Projekt kann nicht angezeigt werden ====
==== Projekt kann nicht angezeigt werden ====


[[Datei:Projekt_kann_nicht_angezeigt_werden.png]] Dieser Fehler tritt auf, wenn Sie im VBA-Editor von Word das Projekt einer globalen Vorlage anklicken, welche nicht als Datei geöffnet wurde. '''Lösung:''' Öffnen Sie die entsprechende Vorlage in Word und versuchen Sie es dann erneut.
[[Datei:Projekt_kann_nicht_angezeigt_werden.png]]  
 
Dieser Fehler tritt auf, wenn Sie im VBA-Editor von Word das Projekt einer globalen Vorlage anklicken, welche nicht als Datei geöffnet wurde. '''Lösung:''' Öffnen Sie die entsprechende Vorlage in Word und versuchen Sie es dann erneut.


=== Fehlermeldungen bei Fehlern im Menüband ===
=== Fehlermeldungen bei Fehlern im Menüband ===
Zeile 252: Zeile 370:
==== Diese Dokumentvorlage kann von Word nicht geöffnet werden ====
==== Diese Dokumentvorlage kann von Word nicht geöffnet werden ====


[[Datei:Diese_Dokumentvorlage_kann_von_Word_nicht_geöffnet_werden.png]] Dieser Fehler tritt beim Starten von Word auf:
[[Datei:Diese_Dokumentvorlage_kann_von_Word_nicht_geöffnet_werden.png]]  
 
Dieser Fehler tritt beim Starten von Word auf:
* Die hier angegebene [[Word Add-Ins|globale Dokumentvorlage]] kann nicht geöffnet werden.
* Die hier angegebene [[Word Add-Ins|globale Dokumentvorlage]] kann nicht geöffnet werden.
* Ein möglicher Grund besteht darin, dass eine Änderung an der [[Menüband#OOXML|OOXML-Datei]] Probleme verursacht.
* Ein möglicher Grund besteht darin, dass eine Änderung an der [[Menüband#OOXML|OOXML-Datei]] Probleme verursacht.
Zeile 259: Zeile 379:
==== Wir konnten die Datei nicht finden ====
==== Wir konnten die Datei nicht finden ====


[[Datei:Wir_konnten_die_Datei_nicht_finden.png]] Sie versuchen unter Umständen, eine Datei mit einer fehlerhaften Anpassung des Menübands zu öffnen (siehe auch [[#Diese Dokumentvorlage kann von Word nicht geöffnet werden|Diese Dokumentvorlage kann von Word nicht geöffnet werden]]. Öffnen Sie die Datei direkt aus dem Datei-Explorer, anstatt sie aus der Liste 'zuletzt verwendeter Dokumente' zu öffnen.
[[Datei:Wir_konnten_die_Datei_nicht_finden.png]]  
 
Sie versuchen unter Umständen, eine Datei mit einer fehlerhaften Anpassung des Menübands zu öffnen (siehe auch [[#Diese Dokumentvorlage kann von Word nicht geöffnet werden|Diese Dokumentvorlage kann von Word nicht geöffnet werden]]. Öffnen Sie die Datei direkt aus dem Datei-Explorer, anstatt sie aus der Liste 'zuletzt verwendeter Dokumente' zu öffnen.

Version vom 15. März 2018, 11:28 Uhr

Bitte beachten: Der VBA-Editor springt bei vielen Fehlern nicht direkt in die Zeile, in welcher der Fehler auftritt, sondern in die Zeile, in welcher der oberste Aufruf steht. Wenn z. B. ein Fehler in einer Klassenprozedur auftritt, kann es vorkommen, dass der VBA-Editor in der Zeile den Fehler anzeigt, in welcher die Klassenprozedur aufgerufen wird. Um die tatsächlich fehlerhafte Zeile zu finden, sollten Sie deshalb die nächsten Schritte schrittweise ausführen lassen (F8-Taste), bis der Fehler noch einmal auftritt.

Kompilierfehler

Kompilierfehler werden durch eine Art Rechtschreibprüfung erkannt, bevor der Programmcode durchgeführt wird. Meistens werden sie durch falsch geschriebene Befehle, Variablen etc. hervorgerufen. Ein weiterer Grund für einen Kompilierfehler ist das Fehlen einer erwarteten Funktion, wenn z. B. ein referenziertes Projekt oder eine Bibliothek fehlt oder nicht in der erwarteten Version zur Verfügung steht. Sie können diese Fehlersuche mit dem Befehl Debuggen, Kompilieren von ... jederzeit selbst starten. Wenn der Befehl nicht aktiv ist, wurde das Projekt schon kompiliert und keine Fehler festgestellt.

Argument ist nicht optional

Fehler beim Kompilieren - Argument ist nicht optional.png

Dieser Fehler trit auf, wenn Sie eine Prozedur (Sub, Funktion oder Property) aufrufen und einen oder mehrere erwartete Übergabeparameter nicht angegeben haben. Prüfen Sie bitte, welche Übergabeparameter erwartet werden!

Argumenttyp ByRef unverträglich

Fehler beim Kompilieren - Argumenttyp ByRef unverträglich.png

Wenn die Variable als Kopie übernommen wird (ByVal), dann wandelt VBA den Wert in den erwarteten Datentyp um, sofern dies möglich ist. Wenn eine Variable als Referenz (ByRef) übergeben werden soll, muss der Datentyp übereinstimmen, denn eine automatische Umwandlung findet hier nicht statt. Beispiel: Sub VariantByRef() ' Bei der Deklaration wurde vergessen, den Datentyp anzugeben ' Somit erhält die Variable 'lngNumber' den Datentyp Variant Dim lngNumber, lngValue As Long lngNumber = 2 DoSomething lngNumber ' <- Hier tritt der Fehler auf End Sub ' Bei dieser Prozedur wurde vergessen, den Parameter mit 'ByVal' zu kennzeichnen ' Somit wird keine Kopie des übergebenen Wertes erstellt, sondern die Adresse der ' aufrufenden Variable übergeben. Diese ist aber kein Long-Wert, sondern ein Variant (siehe oben). Sub DoSomething(lngNumber As Long) End Sub

Benutzerdefinierter Typ nicht definiert

Fehler beim Kompilieren - Benutzerdefinierter Typ nicht definiert.png

Neben der offensichtlichen Fehlerquelle (dass der benutzerdefinierte Datentyp tatsächlich nicht definiert wurde) kann dieser Fehler auch auftreten, wenn

  • der benutzerdefinierte Typ zwar definiert wurde, aber nicht den benötigten Geltungsbereich hat (zum Beispiel 'Private' definiert wurde statt 'Public')
  • der benutzerdefnierte Typ nicht, wie vorgeschrieben, im Modulkopf definiert wurde, sondern später im Modul. Beispiel: Option Explicit Sub Procedure01() MsgBox "I will do something!" End Sub Public Type tpePosition Top As Double Left As Double End Type Sub Procedure02(ByRef myPosition As tpePosition) MsgBox "I will do something else..." End Sub Korrekt: Option Explicit Public Type tpePosition Top As Double Left As Double End Type Sub Procedure01() MsgBox "I will do something!" End Sub Sub Procedure02(ByRef myPosition As tpePosition) MsgBox "I will do something else..." End Sub

Benutzerdefinierter Typ ohne Elemente nicht zulässig

Fehler beim Kompilieren - Benutzerdefinierter Typ ohne Elemente nicht zulässig.png

Ein Benutzerdefinierter Datentyp 'Type' muss mindestens ein Element enthalten. === Datenfeldargument muß als Referenz (ByRef) übergeben werden=== Fehler beim Kompilieren - Datenfeldargument muß als Referenz übergeben werden.png

Sie versuchen, einer Prozedur ein Array als Wert zu übergeben (ByVal). Dies ist nicht möglich, denn Arrays können ausschließlich 'ByRef' übergeben werden.

Sub Test(byval strAnt() as String)          ' Erzeugt den oben genannten Kompilierfehler Beachten Sie jedoch bei der Übergabe als Referenz folgendes: Variablen: Übergabeparameter

Erwartet: )

Fehler beim Kompilieren - Erwartet Klammer zu.png

Diese Fehlermeldung erscheint in folgenden Situationen:

Private Function LoadData() As String(3)    ' Falsch! 
Private Function LoadData() As String()     ' Richtig ...

Funktionsaufruf auf der linken Seite der Zuweisung muss den Typ Variant oder Object zurückgeben

Fehler beim Kompilieren - Funktionsaufruf auf der linken Seite der Zuweisung.png

Dieser Fehler tritt auf, wenn Sie eine Funktion verwenden, die ein Array als Rückgabewert hat und dann versuchen, der Funktionsvariablen direkt einen Wert zuzuweisen.

Function LoadNames() As String() 

    ReDim LoadNames(4)      ' klappt 
    LoadNames(0) = "Peter"  ' klappt nicht!!! 
End Function 

In diesem Fall muss eine Rückgabevariable verwendet werden, welche gefüllt und am Ende erst in die Funktionsvariable übergeben wird:

Function LoadNames() As String() 
    Dim strReturn() As String 

    ReDim strReturn(4) 
    strReturn(0) = "Peter" ' ... 
    LoadNames = strReturn 
End Function 

Siehe auch Array: Rückgabewert einer Funktion

Keine Zuweisung an Datenfeld möglich

Fehler beim Kompilieren - Keine Zuweisung an Datenfeld möglich.png

Tritt im Zusammenhang mit Arrays auf:

  • Sie versuchen, ein Array in ein anderes zu übernehmen, welches nicht den gleichen Datentyp hat. Bei einfachen Datentypen wäre dies möglich, Arrays kann VBA jedoch nicht in andere Datentypen umwandeln: Dim strTexts() As String, lngNumbers() As Long strTexts = lngNumbers
  • Sie versuchen, zwei unterschiedlich dimensionierte statische Arrays ineinander zu übernehmen: Dim strStatic1(8) As String, strStatic2(5) As String strStatic1 = strStatic2
  • Sie versuchen, ein dynamisches Array in ein statisches zu übernehmen: Dim strStatic(8) As String, strDynamic() As String strStatic = strDynamic Anmerkung: Der umgekehrte Fall wäre durchaus möglich: Dim strStatic(8) As String, strDynamic() As String strDynamic = strStatic Wichtig: Dieser Fehler tritt auch auf, wenn das problematische Array aus einer Funktion zurückgegeben wird!

Mehrdeutiger Name

Fehler beim Kompilieren - Mehrdeutiger Name.png

Wahrscheinlich wurden mehrere Prozeduren mit dem gleichen Namen angelegt.

Mehrfachdeklaration im aktuellen Gültigkeitsbereich

Fehler beim Kompilieren - Mehrfachdeklaration im aktuellen Gültigkeitsbereich.png

Sie haben zwei Variablen innerhalb einer Prozedur gleich benannt oder eine schon deklarierte Variable noch einmal deklariert:

Sub DuplicateDeclaration() 
    Dim strVariable As String 
    ' ..... 
    Dim strVariable As String 
    ' ..... 
End Sub

Nach End Sub, End Function oder End Property können nur Kommentare stehen

Fehler beim Kompilieren - Nach End Sub, End Function oder End Property können nur Kommentare stehen.png

Dieser Fehler tritt zum Beispiel in folgender Situation auf, in der ein 'Type' nach einer Prozedur definiert wurde:

Option Explicit 

Sub Procedure01() 

    MsgBox "I will do something!" 
End Sub 

Public Type tpePosition
    Top As Double 
    Left As Double 
End Type 

Korrekt: Benutzerdefinierte Datentypen ('Type') müssen im Modulkopf definiert werden!

Option Explicit 

Public Type tpePosition 
    Top As Double 
    Left As Double 
End Type Sub 

Procedure01() 

    MsgBox "I will do something!" 
End Sub

Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden

Fehler beim Kompilieren - Nur benutzerdefinierte Typen die in öffentlichen Objektmodulen definiert sind.png

Dieser Fehler tritt auf, wenn Sie versuchen, ein Element, das ein benutzerdefinierter Datentyp 'Type' ist, einer Collection-Auflistung hinzuzufügen. Die Collection kann ausschließlich Elemente vom Datentyp Variant aufnehmen, oder sie werden entsprechend konvertiert. Bei benutzerdefinierten Datentypen ist diese Konvertierung jedoch nicht möglich.

Tipp: Verwenden Sie statt der Collection ein Array!

Objekt erforderlich

Fehler beim Kompilieren - Objekt erforderlich.png

Beispiel: Dim strText As String Set strText = "Hallo!" muss korrekt lauten: Dim strText As String strText = "Hallo!" denn das Schlüsselwort 'Set' darf ausschließlich bei Objektvariablen verwendet werden!

Steuervariable für For Each muß vom Typ Variant oder Object sein

Fehler beim Kompilieren - Steuervariable für For Each muß vom Typ Variant oder Object sein.png

Tritt in dieser Situation auf: Dim strText As String Dim col As Collection Set col = New Collection col.Add "Eins" col.Add "Zwei" For Each strText In col Debug.Print strText Next strText Die 'For Each'-Schleife erlaubt es nicht, dass die Steuervariable 'strText' vom Typ 'String' ist. Sie müsste in diesem Fall vom Typ 'Variant' sein. Oder Sie ersetzen die 'For Each'-Schleife durch eine passende 'For'-Schleife: Dim lngIndex As Long Dim col As Collection Set col = New Collection col.Add "Eins" col.Add "Zwei" For lngIndex = 1 To col.Count Debug.Print col.Item(lngIndex) Next lngIndex

Sub oder Function nicht definiert

Fehler beim Kompilieren - Sub oder Function nicht definiert.png

Überprüfen Sie die Schreibweise des Befehls. Kürzen Sie den Befehl gegebenenfalls und verwenden Sie 'Strg+Leertaste', um den Befehl vom VBA-Editor korrekt vervollständigen zu lassen. Diese Fehlermeldung tritt auch dann auf, wenn der Befehl zwar korrekt geschrieben, aber von diesem Modul aus nicht erreichbar ist (siehe Prozeduren: Geltungsbereich).

Syntaxfehler

Fehler beim Kompilieren - Syntaxfehler.png

Syntaxfehler sind mit Rechtschreib- bzw. Grammatikfehlern vergleichbar: Entweder ein Befehl wurde falsch geschrieben oder der Befehlsaufbau stimmt nicht mit den Vorgaben überein. Syntaxfehler treten häufig in folgenden Situationen auf:

Beschreibung Beispielcode Korrigiert Siehe auch
Beim Aufruf einer Sub-Prozedur wurden Klammern verwendet MsgBox("Kein Rückgabewert, keine Klammern!", , "Syntaxfehler") MsgBox "Kein Rückgabewert, keine Klammern!", , "Syntaxfehler" Klammersetzung
Beim Aufruf einer Funktion wurden die Klammern vergessen Debug.Print CDate "2015-03-29" Debug.Print CDate("2015-03-29") Klammersetzung
Bei Klartext wurden die Anführungszeichen vergessen strText = Hallo und herzlich willkommen! strText = "Hallo und herzlich willkommen!" Zeichenketten
Ein Array wurde 'ByVal' übergeben: Arrays können ausschließlich als Referenz übergeben werden! Sub PrintArrayElements(byval strArray() As String) Sub PrintArrayElements(ByRef strArray() As String) Array
Ein statisches Array wird als Argument erwartet: Nur dynamische Arrays können an eine Prozedur übergeben werden! Sub PrintArrayElements(ByRef strArray(7) As String) Sub PrintArrayElements(ByRef strArray() As String) Array
Eine falsch formulierte Verneinung mit 'Not': If "a" Not = "A" Then If "a" Not Like "A" Then ' ... etc. If Not "a" = "A" Then If Not "a" Like "A" Then ' ... etc. Abfragen: Vergleich umkehren (Not)


Ungültiger Verweis auf Next-Steuervariable

Fehler beim Kompilieren - Ungültiger Verweis auf Next-Steuervariable.png

Beispielcode Korrigiert Anmerkungen
For lngRow = 1 To 3 For lngColumn = 1 To 5 Next lngRow ' lngRow gehört in die äußere Schleife Next lngColumn For lngRow = 1 To 3 For lngColumn = 1 To 5 Next lngColumn Next lngRow


Unzulässige Verwendung einer Eigenschaft

Fehler beim Kompilieren - Unzulässige Verwendung einer Eigenschaft.png

Dieser Fehler tritt auf, wenn Sie eine Eigenschaft aufrufen, aber weder den Wert abfragen noch diesen setzen: rngCell.Font.Bold ' Erzeugt den Fehler muss vollständig lauten: rngCell.Font.Bold = True ' Wenn der Text fett dargestellt werden soll oder blnBold = rngCell.Font.Bold ' Wenn Sie wissen möchten, ob der Text fett formatiert ist Der Fehler wird ebenfalls hier erzeugt: If colCollection = Nothing Then Exit Sub muss lauten: If colCollection Is Nothing Then Exit Sub

Unzulässige Verwendung eines Objekts

Fehler beim Kompilieren - Unzulässige Verwendung eines Objekts.png

Beispielcode Korrigiert Anmerkungen
If shp = Nothing Then Exit Sub


Variable nicht definiert

Fehler beim Kompilieren - Variable nicht definiert.png

  • Prüfen Sie, ob die Variable deklariert wurde.
  • Überprüfen Sie den Namen der Variablen. Kürzen Sie den Namen gegebenenfalls und verwenden Sie 'Strg+Leertaste', um den Namen vom VBA-Editor korrekt vervollständigen zu lassen. Beispiele: Dim lngIndex As Long lngEndex = 2 ' Falsch geschrieben! Dim colCollection As Collection Set colCollection = Collection ' 'New' fehlt, daher interpretiert VBA 'Collection' als Name einer ' nicht deklarierten Variablen ...
  • Das geforderte Parent-Objekt zu einem Objekt fehlt. Beispiel PowerPoint: Vor dem Aufruf der 'Selection' wird 'ActiveWindow' erwartet: Debug.Print Selection.ShapeRange.Count richtig: Debug.Print ActiveWindow.Selection.ShapeRange.Count

Variable oder Prozedur anstelle eines Moduls erwartet

Fehler beim Kompilieren - Variable oder Prozedur anstelle eines Moduls erwartet.png

Wahrscheinlich enthält das aktuelle Projekt ein Modul und eine Prozedur mit dem selben Namen. Grundsätzlich ist dies möglich, aber wenn Sie versuchen, aus einem anderen Modul heraus die Prozedur aufzurufen, tritt dieser Fehler auf, weil nun nicht klar ist, ob die Prozedur oder das Modul gemeint ist. Dieser Fehler tritt außerdem auf, wenn Sie einem Modul den Namen einer eingebauten Prozedur (zum Beispiel 'Replace') geben. Lösung: Fügen Sie Modulnamen ein 'mod' vorne an, damit sich Modulnamen deutlich von Prozedurnamen unterscheiden. ;Beispiele:

  • Das Modul 'CalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier tritt der Fehler auf, wenn aus einem anderen Modul heraus 'CalculateSomething' aufgerufen wird.
  • Das Modul 'modCalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier gibt es keinen Konflikt und keine Fehlermeldung.

Laufzeitfehler

Laufzeitfehler treten erst beim Durchführen einer Programmzeile auf. Oft werden diese Fehler verursacht, weil ein erwarteter Wert nicht den Anforderungen entspricht.

6: Überlauf

Laufzeitfehler 6 - Überlauf.png       Laufzeitfehler 6 - Überlauf 2.png

Dieser Fehler tritt auf,

  • wenn Sie einer ganzzahligen Variablen einen zu großen Wert zuweisen.
  • wenn Sie Null durch Null teilen ( 0 / 0 ).

9: Index außerhalb des gültigen Bereichs

Laufzeitfehler 9 - Index außerhalb des gültigen Bereichs.png

Tritt zum Beispiel dann auf, wenn Sie versuchen, auf ein nicht existierendes Element einer Collection zuzugreifen.

11: Division durch Null

Laufzeitfehler 11 - Division durch Null.png

Ein typischer Laufzeitfehler tritt bei dem Versuch auf, eine Zahl durch Null zu teilen. Ob eine Division möglich ist, wird erst dann geprüft, wenn die beiden Werte bekannt sind, also zur Laufzeit.

13: Typen unverträglich

Laufzeitfehler 13 - Typen unverträglich.png

Sie versuchen wahrscheinlich, einer Prozedur einen Wert zu übergeben, der nicht erwartet wird bzw. nicht in den erwarteten Wert umgewandelt werden kann. Ein typischer Fall könnte sein, dass Sie einen Text übergeben, obwohl eine Zahl erwartet wird. Dies mag in vielen Fällen klappen (wenn der Text automatisch in eine Zahl umgewandelt werden kann), aber in genau diesem Fall (zur Laufzeit) eben nicht. Option Explicit Private lngSum As Long ' Modul-Variable merkt sich die Summe Private Function AddValue(ByVal lngValue As Long) lngSum = lngSum + lngValue ' Der übergebene Wert wird zur Modul-Variable addiert End Function AddValue 12 ' Korrekter Aufruf: Zahl wird erwartet AddValue "12" ' Geduldeter Aufruf: Die Zeichenkette "12" kann in die Zahl 12 umgewandelt werden AddValue "Max" ' Fehler: Die Zeichenkette "Max" kann NICHT in Zahl umgewandelt werden Bitte beachten: Dieser Fehler wird auch in folgender Situation angezeigt: lngValue = CLng("Max") Der Fehler 'Typen unverträglich' ist in diesem Falle irreführend, weil die Übergabe einer Zeichenkette durchaus erlaubt ist, der Text 'Max' jedoch nicht in eine Zahl umgewandelt werden kann ...

28: Nicht genügend Stapelspeicher

Laufzeitfehler 28 - Nicht genügend Stapelspeicher.png

Bei jedem Aufruf einer Prozedur wird auf dem Stapelspeicher eine Art Marke hinterlassen, damit der Programmablauf nach Beendigung der Prozedur zur aufrufenden Prozedur zurückkehren und den Programmablauf weiter verfolgen kann. Wenn der dafür bereitgestellte Platz nicht ausreicht, wird dieser Fehler angezeigt. Der Fehler kann also auftreten, wenn Sie eine zu tiefe Verschachtelung von Prozeduren haben (A ruft B auf, B ruft C auf, C ruft D auf etc.) oder wenn Sie eine Endlos-Rekursion erzeugt haben (siehe Kontrollstrukturen: Rekursion).

53: Datei nicht gefunden

Laufzeitfehler 53 - Datei nicht gefunden.png

  • Betrifft Datei-Operationen wie Open, Kill, FileCopy etc.
  • Tritt auf, wenn die angegebene Datei nicht gefunden werden kann
  • Siehe auch Arbeiten mit Dateien

91: Objekt oder With-Blockvariable nicht festgelegt

Laufzeitfehler 91 - Objekt oder With-Blockvariable nicht festgelegt.png

Tritt auf, wenn Sie versuchen, ein Objekt zu verwenden, bevor es mit 'Set' instanziiert wurde. Dim colCollection As Collection colCollection.Add "Test Korrekt: Dim colCollection As Collection Set colCollection = New Collection colCollection.Add "Test"

424: Objekt erforderlich

Laufzeitfehler 424 - Objekt erforderlich.png

Neben den in der Hilfe aufgeführten Gründen (z. B. der Zugriff auf eine Eigenschaft ohne Angabe des Objektqualifizierers) kann diese Fehlermeldung auch in Situationen wie dieser auftreten: ActiveCell.Left = 34 Die 'Left'-Eigenschaft einer Zelle kann nur abgefragt, aber nicht gesetzt werden, denn sie ist schreibgeschützt.

429: Objekterstellung durch ActiveX-Komponente nicht möglich

Laufzeitfehler 429 - Objekterstellung durch ActiveX-Komponente nicht möglich.png

Dieser Fehler tritt auf, wenn Sie versuchen, mit 'GetObject' auf eine Anwendung zuzugreifen, die nicht läuft. Siehe Fernsteuerung.

457: Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet

Laufzeitfehler 457 - Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet.png

Tritt auf, wenn Sie versuchen, einer Auflistung (Collection) ein weiteres Element mit einem schon verwendeten Schlüssel zu vergeben. Dim colCollection As Collection Set colCollection = New Collection colCollection.Add "Test", "test" colCollection.Add "Prüfung", "test"

1004: Anwendungs- oder objektdefinierter Fehler

Laufzeitfehler 1004 - Anwenungs oder objektdefinierter Fehler.png

Tritt zum Beispiel auf, wenn Sie versuchen, auf ein nicht vorhandenes Element einer Auflistung zuzugreifen Cells(1, 0) ' Die Spalte mit dem Index 0 gibt es in Excel nicht! Range("H2", 34) ' Der Bereich von der Zelle 'H2' bis '34' kann nicht gebildet werden ...

1004: Dieser Name wird bereits verwendet. Verwenden Sie einen anderen.

Laufzeitfehler 1004 - Dieser Name wird bereits verwendet.png

Erscheint, wenn in Excel ein Arbeitsblatt umbenannt werden soll und es existiert bereits ein Arbeitsblatt mit dem Namen.

5941: Das angeforderte Element ist nicht in der Sammlung vorhanden

Laufzeitfehler 5941 - Das angeforderte Element ist nicht in der Sammlung vorhanden.png

Tritt auf, wenn Sie auf ein Element einer Auflistung zugreifen möchten, welches nicht vorhanden ist. ActiveDocument.Tables(1).AllowAutoFit = True ' Dokument enthält keine Tabelle ActiveDocument.FormFields.Item("txtNone").Result ' Formularfeld 'txtNone' existiert nicht

Sonstige Fehler

Fehlermeldungen des VBA-Editors

Nach diesem Vorgang wird das Projekt zurückgesetzt

Nach diesem Vorgang wird das Projekt zurückgesetzt.png

Diese Fehlermeldung erscheint häufig, wenn Sie während der Fehlersuche beim schrittweisen Ausführen eine Änderung an der Programmierung vornehmen, welche die weitere Ausführung unterbrechen wird. Wichtig: Wenn Sie hier nicht mir 'OK' bestätigen, dass Sie trotzdem fortfahren möchten, werden Ihre letzen Änderungen rückgängig gemacht!

Projekt kann nicht angezeigt werden

Projekt kann nicht angezeigt werden.png

Dieser Fehler tritt auf, wenn Sie im VBA-Editor von Word das Projekt einer globalen Vorlage anklicken, welche nicht als Datei geöffnet wurde. Lösung: Öffnen Sie die entsprechende Vorlage in Word und versuchen Sie es dann erneut.

Fehlermeldungen bei Fehlern im Menüband

Siehe Fehlermeldungen bei selbst erstellten Menübändern.

Leider kann 'Datei' nicht geöffnet werden, da der Inhalt Probleme verursacht

Leider kann 'Datei' nicht geöffnet werden da der Inhalt Probleme verursacht.png Leider kann 'Datei' nicht geöffnet werden da der Inhalt Probleme verursacht Deatails.png

Von Anwendung wurde nicht lesbarer Inhalt in Datei gefunden

Von Word wurde nicht lesbarer Inhalt in Datei gefunden.png

Word spezifische Fehler

Diese Dokumentvorlage kann von Word nicht geöffnet werden

Diese Dokumentvorlage kann von Word nicht geöffnet werden.png

Dieser Fehler tritt beim Starten von Word auf:

Wir konnten die Datei nicht finden

Wir konnten die Datei nicht finden.png

Sie versuchen unter Umständen, eine Datei mit einer fehlerhaften Anpassung des Menübands zu öffnen (siehe auch Diese Dokumentvorlage kann von Word nicht geöffnet werden. Öffnen Sie die Datei direkt aus dem Datei-Explorer, anstatt sie aus der Liste 'zuletzt verwendeter Dokumente' zu öffnen.