Fehlermeldungen: Unterschied zwischen den Versionen
Pwania (Diskussion | Beiträge) |
Pwania (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(63 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Category:vba-wiki]] | |||
'''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. | '''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. | ||
Zeile 15: | Zeile 16: | ||
[[Datei:Fehler_beim_Kompilieren_-_Argumenttyp_ByRef_unverträglich.png]] | [[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 | 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: | |||
<span style="Color:blue"> Sub </span>VariantByRef<span style="Color:gray">()</span> | |||
<span style="Color:green">' Bei der Deklaration wurde vergessen, den Datentyp anzugeben</span> | |||
<span style="Color:green">' Somit erhält die Variable 'lngNumber' den Datentyp Variant</span> | |||
<span style="Color:blue"> Dim </span>lngNumber<span style="Color:gray">,</span> lngValue<span style="Color:blue"> As Long</span> | |||
lngNumber <span style="Color:gray">=</span> <span style="Color:gray">2</span> | |||
DoSomething lngNumber <span style="Color:green">' <- Hier tritt der Fehler auf</span> | |||
<span style="Color:blue"> End Sub</span> | |||
<span style="Color:green">' Bei dieser Prozedur wurde vergessen, den Parameter mit 'ByVal' zu kennzeichnen</span> | |||
<span style="Color:green">' Somit wird keine Kopie des übergebenen Wertes erstellt, sondern die Adresse der</span> | |||
<span style="Color:green">' aufrufenden Variable übergeben. Diese ist aber kein Long-Wert, sondern ein Variant (siehe oben).</span> | |||
<span style="Color:blue"> Sub </span>DoSomething<span style="Color:gray">(</span>lngNumber<span style="Color:blue"> As Long</span><span style="Color:gray">)</span> | |||
<span style="Color:blue"> End Sub</span> | |||
=== Benutzerdefinierter Typ nicht definiert === | === Benutzerdefinierter Typ nicht definiert === | ||
Zeile 22: | Zeile 42: | ||
Neben der offensichtlichen Fehlerquelle (dass der benutzerdefinierte Datentyp tatsächlich nicht definiert wurde) kann dieser Fehler auch auftreten, wenn | 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 | * der benutzerdefnierte Typ nicht, wie vorgeschrieben, im Modulkopf definiert wurde, sondern später im Modul. | ||
Beispiel: | |||
<span style="Color:blue"> Option Explicit</span> | |||
<span style="Color:blue"> Sub </span>Procedure<span style="Color:gray">01()</span> | |||
MsgBox <span style="Color:gray">"I will do something!"</span> | |||
<span style="Color:blue"> End Sub</span> | |||
<span style="Color:blue"> Public Type </span>tpePosition | |||
Top<span style="Color:blue"> As Double</span> | |||
Left<span style="Color:blue"> As Double | |||
End Type</span> | |||
<span style="Color:blue"> Sub </span>Procedure<span style="Color:gray">02(</span><span style="Color:blue">ByRef </span>myPosition<span style="Color:blue"> As </span>tpePosition<span style="Color:gray">)</span> | |||
MsgBox <span style="Color:gray">"I will do something else..."</span> | |||
<span style="Color:blue"> End Sub</span> | |||
Korrekt: | |||
<span style="Color:blue"> Option Explicit</span> | |||
<span style="Color:blue"> Public Type </span>tpePosition | |||
Top<span style="Color:blue"> As Double</span> | |||
Left<span style="Color:blue"> As Double | |||
End Type</span> | |||
<span style="Color:blue"> Sub </span>Procedure<span style="Color:gray">01()</span> | |||
MsgBox <span style="Color:gray">"I will do something!"</span> | |||
<span style="Color:blue"> End Sub</span> | |||
<span style="Color:blue"> Sub </span>Procedure<span style="Color:gray">02(</span><span style="Color:blue">ByRef </span>myPosition<span style="Color:blue"> As </span>tpePosition<span style="Color:gray">)</span> | |||
MsgBox <span style="Color:gray">"I will do something else..."</span> | |||
<span style="Color:blue"> End Sub</span> | |||
=== Benutzerdefinierter Typ ohne Elemente nicht zulässig === | === Benutzerdefinierter Typ ohne Elemente nicht zulässig === | ||
Zeile 30: | Zeile 95: | ||
Ein Benutzerdefinierter Datentyp 'Type' muss mindestens ein Element enthalten. | Ein Benutzerdefinierter Datentyp 'Type' muss mindestens ein Element enthalten. | ||
=== Compilerfehler im ausgeblendeten Modul === | |||
[[Datei:Compilerfehler_im_ausgeblendeten_Modul.png]] | |||
[[Datei:Verweis_nicht_vorhanden.png]] | |||
=== Datenfeldargument muß als Referenz (ByRef) übergeben werden=== | === Datenfeldargument muß als Referenz (ByRef) übergeben werden=== | ||
Zeile 37: | Zeile 108: | ||
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. | 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( | <span style="Color:blue"> Sub </span>Test<span style="Color:gray">(</span><span style="Color:blue">byVal </span>strArray<span style="Color:gray">()</span><span style="Color:blue"> as String</span><span style="Color:gray">)</span> <span style="Color:green">' Erzeugt den oben genannten Kompilierfehler </span> | ||
Beachten Sie jedoch bei der Übergabe als Referenz folgendes: [[Variablen#Übergabeparameter|Variablen: Übergabeparameter]] | Beachten Sie jedoch bei der Übergabe als Referenz folgendes: [[Variablen#Übergabeparameter|Variablen: Übergabeparameter]] | ||
Zeile 48: | Zeile 119: | ||
* Funktionen dürfen keine statischen Arrays zurückgeben (siehe [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]]): | * 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! | <span style="Color:blue"> Private Function </span>LoadData<span style="Color:gray">()</span><span style="Color:blue"> As </span>String<span style="Color:gray">(3)</span> <span style="Color:green">' Falsch! :-(</span> | ||
Private Function LoadData() As String() ' | <span style="Color:blue"> Private Function </span>LoadData<span style="Color:gray">()</span><span style="Color:blue"> As </span>String<span style="Color:gray">()</span> <span style="Color:green">' Korrekt!! :-)</span> | ||
=== 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 === | ||
Zeile 57: | Zeile 128: | ||
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. | 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() | <span style="Color:blue"> Function </span>LoadNames<span style="Color:gray">()</span><span style="Color:blue"> As </span>String<span style="Color:gray">()</span> | ||
ReDim LoadNames(4) ' klappt | <span style="Color:blue"> ReDim </span>LoadNames<span style="Color:gray">(4)</span> <span style="Color:green">' klappt </span> | ||
LoadNames<span style="Color:gray">(0)</span> <span style="Color:gray">=</span> <span style="Color:gray">"Peter"</span> <span style="Color:green">' klappt nicht!!! </span> | |||
End Function | <span style="Color:blue"> End Function </span> | ||
In diesem Fall muss eine Rückgabevariable verwendet werden, welche gefüllt und am Ende erst in die Funktionsvariable übergeben wird: | 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() | <span style="Color:blue"> Function </span>LoadNames<span style="Color:gray">()</span><span style="Color:blue"> As </span>String<span style="Color:gray">()</span> | ||
Dim strReturn() As String | <span style="Color:blue"> Dim </span>strReturn<span style="Color:gray">()</span><span style="Color:blue"> As String </span> | ||
ReDim strReturn(4) | <span style="Color:blue"> ReDim </span>strReturn<span style="Color:gray">(4)</span> | ||
strReturn<span style="Color:gray">(0)</span> <span style="Color:gray">=</span> <span style="Color:gray">"Peter"</span> <span style="Color:green">' ... </span> | |||
LoadNames <span style="Color:gray">=</span> strReturn | |||
End Function | <span style="Color:blue"> End Function </span> | ||
Siehe auch [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]] | Siehe auch [[Array#R.C3.BCckgabewert_einer_Funktion|Array: Rückgabewert einer Funktion]] | ||
Zeile 82: | Zeile 153: | ||
* 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: | * 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 | <span style="Color:blue"> Dim </span>strTexts<span style="Color:gray">()</span><span style="Color:blue"> As String</span><span style="Color:gray">,</span> lngNumbers<span style="Color:gray">()</span><span style="Color:blue"> As Long </span> | ||
strTexts <span style="Color:gray">=</span> lngNumbers | |||
* Sie versuchen, zwei unterschiedlich dimensionierte statische Arrays ineinander zu übernehmen: | * Sie versuchen, zwei unterschiedlich dimensionierte statische Arrays ineinander zu übernehmen: | ||
Dim | <span style="Color:blue"> Dim </span>strStatic<span style="Color:gray">1(8)</span><span style="Color:blue"> As String</span><span style="Color:gray">,</span> strStatic<span style="Color:gray">2(5)</span><span style="Color:blue"> As String </span> | ||
strStatic<span style="Color:gray">1</span> <span style="Color:gray">=</span> strStatic<span style="Color:gray">2</span> | |||
* Sie versuchen, ein dynamisches Array in ein statisches zu übernehmen: | * Sie versuchen, ein dynamisches Array in ein statisches zu übernehmen: | ||
Dim strStatic(8) As String, strDynamic() As String | <span style="Color:blue"> Dim </span>strStatic<span style="Color:gray">(8)</span><span style="Color:blue"> As String</span><span style="Color:gray">,</span> strDynamic<span style="Color:gray">()</span><span style="Color:blue"> As String </span> | ||
strStatic <span style="Color:gray">=</span> strDynamic | |||
Anmerkung: Der umgekehrte Fall wäre durchaus möglich: | Anmerkung: Der umgekehrte Fall wäre durchaus möglich: | ||
Dim strStatic(8) As String, strDynamic() As String | <span style="Color:blue"> Dim </span>strStatic<span style="Color:gray">(8)</span><span style="Color:blue"> As String</span><span style="Color:gray">,</span> strDynamic<span style="Color:gray">()</span><span style="Color:blue"> As String </span> | ||
strDynamic <span style="Color:gray">=</span> strStatic | |||
'''Wichtig:''' Dieser Fehler tritt auch auf, wenn das problematische Array aus einer Funktion zurückgegeben wird! | '''Wichtig:''' Dieser Fehler tritt auch auf, wenn das problematische Array aus einer Funktion zurückgegeben wird! | ||
=== Kompilerfehler im ausgeblendeten Modul === | |||
Siehe [[#Compilerfehler im ausgeblendeten Modul|Compilerfehler im ausgeblendeten Modul]] | |||
=== Mehrdeutiger Name === | === Mehrdeutiger Name === | ||
Zeile 109: | Zeile 184: | ||
Wahrscheinlich wurden mehrere Prozeduren mit dem gleichen Namen angelegt. | Wahrscheinlich wurden mehrere Prozeduren mit dem gleichen Namen angelegt. | ||
Bedenken Sie, dass dieser Fehler auch auftritt, wenn öffentliche Prozeduren in verschiedenen Modulen den gleichen Namen tragen! | |||
=== Mehrfachdeklaration im aktuellen Gültigkeitsbereich === | === Mehrfachdeklaration im aktuellen Gültigkeitsbereich === | ||
Zeile 116: | Zeile 193: | ||
Sie haben zwei Variablen innerhalb einer Prozedur gleich benannt oder eine schon deklarierte Variable noch einmal deklariert: | Sie haben zwei Variablen innerhalb einer Prozedur gleich benannt oder eine schon deklarierte Variable noch einmal deklariert: | ||
Sub DuplicateDeclaration() | <span style="Color:blue"> Sub </span>DuplicateDeclaration<span style="Color:gray">()</span> | ||
Dim strVariable As String | <span style="Color:blue"> Dim </span>strVariable<span style="Color:blue"> As String </span> | ||
<span style="Color:green">' ..... </span> | |||
Dim strVariable As String | <span style="Color:blue"> Dim </span>strVariable<span style="Color:blue"> As String </span> | ||
<span style="Color:green">' ..... </span> | |||
End Sub | <span style="Color:blue"> End Sub</span> | ||
=== 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 === | ||
Zeile 131: | Zeile 208: | ||
Dieser Fehler tritt zum Beispiel in folgender Situation auf, in der ein 'Type' nach einer Prozedur definiert wurde: | Dieser Fehler tritt zum Beispiel in folgender Situation auf, in der ein 'Type' nach einer Prozedur definiert wurde: | ||
Option Explicit | <span style="Color:blue"> Option Explicit </span> | ||
Sub | <span style="Color:blue"> Sub </span>Procedure<span style="Color:gray">01()</span> | ||
MsgBox <span style="Color:gray">"I will do something!"</span> | |||
End Sub | <span style="Color:blue"> End Sub </span> | ||
Public Type tpePosition | <span style="Color:blue"> Public Type </span>tpePosition | ||
Top<span style="Color:blue"> As Double </span> | |||
Left<span style="Color:blue"> As Double </span> | |||
End Type | <span style="Color:blue"> End Type </span> | ||
Korrekt: Benutzerdefinierte Datentypen ('Type') müssen im Modulkopf definiert werden! | Korrekt: Benutzerdefinierte Datentypen ('Type') müssen im Modulkopf definiert werden, also oberhalb aller Prozeduren! | ||
Option Explicit | <span style="Color:blue"> Option Explicit </span> | ||
Public Type tpePosition | <span style="Color:blue"> Public Type </span>tpePosition | ||
Top<span style="Color:blue"> As Double </span> | |||
Left<span style="Color:blue"> As Double </span> | |||
End Type Sub | <span style="Color:blue"> End Type Sub </span> | ||
Procedure<span style="Color:gray">01()</span> | |||
MsgBox <span style="Color:gray">"I will do something!"</span> | |||
End Sub | <span style="Color:blue"> End Sub</span> | ||
=== 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 161: | Zeile 238: | ||
[[Datei:Fehler_beim_Kompilieren_-_Nur_benutzerdefinierte_Typen_die_in_öffentlichen_Objektmodulen_definiert_sind.png]] | [[Datei: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 | Dieser Fehler tritt auf, wenn Sie versuchen, ein Element, das ein benutzerdefinierter Datentyp '[[Type]]' ist, einer [[Collection]]-Auflistung hinzuzufügen. | ||
'''Tipp:''' Verwenden Sie statt der Collection ein [[Array]]! | 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. | ||
'''Bitte beachten:''' Der Hinweis auf 'öffentliche Objektmodule' ist hier irreführend, denn egal wo oder wie Sie einen benutzerdefinierten Datentyp deklarieren, er kann nicht in einen Variant umgewandelt werden. | |||
'''Tipp:''' Verwenden Sie in diesem Falle statt der Collection ein [[Array]] oder statt des Datentyps 'Type' eine [[Klassenobjekte#Datenklassen|Datenklasse]]! | |||
=== Objekt erforderlich === | === Objekt erforderlich === | ||
Zeile 169: | Zeile 250: | ||
[[Datei:Fehler_beim_Kompilieren_-_Objekt_erforderlich.png]] | [[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! | Beispiel: | ||
<span style="Color:blue"> Dim </span>strText<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> '''Set''' </span>strText <span style="Color:gray">=</span> <span style="Color:gray">"Hallo!"</span> | |||
muss korrekt lauten: | |||
<span style="Color:blue"> Dim </span>strText<span style="Color:blue"> As String</span> | |||
strText <span style="Color:gray">=</span> <span style="Color:gray">"Hallo!"</span> | |||
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 === | ||
Zeile 175: | Zeile 268: | ||
[[Datei:Fehler_beim_Kompilieren_-_Steuervariable_für_For_Each_muß_vom_Typ_Variant_oder_Object_sein.png]] | [[Datei:Fehler_beim_Kompilieren_-_Steuervariable_für_For_Each_muß_vom_Typ_Variant_oder_Object_sein.png]] | ||
Tritt in dieser Situation auf: | Tritt in dieser Situation auf: | ||
<span style="Color:blue"> Dim </span>strText<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>col<span style="Color:blue"> As </span>Collection | |||
<span style="Color:blue"> Set </span>col <span style="Color:gray">=</span><span style="Color:blue"> New </span>Collection | |||
col<span style="Color:gray">.</span>Add <span style="Color:gray">"Eins"</span> | |||
col<span style="Color:gray">.</span>Add <span style="Color:gray">"Zwei"</span> | |||
<span style="Color:blue"> For Each </span>strText In col | |||
Debug<span style="Color:gray">.</span>Print strText | |||
<span style="Color:blue"> Next </span>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: | |||
<span style="Color:blue"> Dim </span>lngIndex<span style="Color:blue"> As Long</span> | |||
<span style="Color:blue"> Dim </span>col<span style="Color:blue"> As </span>Collection | |||
<span style="Color:blue"> Set </span>col <span style="Color:gray">=</span><span style="Color:blue"> New </span>Collection | |||
col<span style="Color:gray">.</span>Add <span style="Color:gray">"Eins"</span> | |||
col<span style="Color:gray">.</span>Add <span style="Color:gray">"Zwei"</span> | |||
<span style="Color:blue"> For </span>lngIndex <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span>col<span style="Color:gray">.</span>Count | |||
Debug<span style="Color:gray">.</span>Print col<span style="Color:gray">.</span>Item<span style="Color:gray">(</span>lngIndex<span style="Color:gray">)</span> | |||
<span style="Color:blue"> Next </span>lngIndex | |||
=== Sub oder Function nicht definiert === | === Sub oder Function nicht definiert === | ||
Zeile 181: | Zeile 298: | ||
[[Datei:Fehler_beim_Kompilieren_-_Sub_oder_Function_nicht_definiert.png]] | [[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]]). | * Ü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 === | ||
Zeile 187: | Zeile 306: | ||
[[Datei:Fehler_beim_Kompilieren_-_Syntaxfehler.png]] | [[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: | Syntaxfehler sind mit Rechtschreib- bzw. Grammatikfehlern vergleichbar: Entweder ein Befehl wurde falsch geschrieben oder der Befehlsaufbau stimmt nicht mit den Vorgaben überein. | ||
{| class="wikitable" | |||
Syntaxfehler treten häufig in folgenden Situationen auf: | |||
{| class="wikitable" | |||
|- | |- | ||
! Beschreibung | ! Beschreibung | ||
Zeile 194: | Zeile 316: | ||
! Korrigiert | ! Korrigiert | ||
! Siehe auch | ! Siehe auch | ||
|- | |- | ||
| Beim Aufruf einer Sub-Prozedur wurden Klammern verwendet | | Beim Aufruf einer Sub-Prozedur wurden Klammern verwendet | ||
| MsgBox("Kein Rückgabewert, keine Klammern!", , "Syntaxfehler") | | | ||
| MsgBox "Kein Rückgabewert, keine Klammern!", , "Syntaxfehler" | <span style="Color:red">MsgBox("Kein Rückgabewert, keine Klammern!", ,"Syntaxfehler")</span> | ||
| [[Klammersetzung]] | | | ||
|- | MsgBox <span style="Color:gray">"Kein Rückgabewert, keine Klammern!",</span> <span style="Color:gray">,</span> <span style="Color:gray">"Syntaxfehler"</span> | ||
| [[Klammersetzung]] | |||
|- | |||
| Beim Aufruf einer Funktion wurden die Klammern vergessen | | Beim Aufruf einer Funktion wurden die Klammern vergessen | ||
| Debug.Print CDate "2015-03-29" | | | ||
| Debug.Print CDate("2015-03-29") | <span style="Color:red">Debug.Print CDate "2015-03-29"</span> | ||
| | |||
Debug<span style="Color:gray">.</span>Print CDate<span style="Color:gray">("2015-03-29")</span> | |||
| [[Klammersetzung]] | | [[Klammersetzung]] | ||
|- | |- | ||
| Bei Klartext wurden die Anführungszeichen vergessen | | Bei Klartext wurden die Anführungszeichen vergessen | ||
| strText = Hallo und herzlich willkommen! | | | ||
| strText = "Hallo und herzlich willkommen!" | <span style="Color:red">strText = Hallo und herzlich willkommen!</span> | ||
| | |||
strText <span style="Color:gray">=</span> <span style="Color:gray">"Hallo und herzlich willkommen!"</span> | |||
| [[Zeichenketten]] | | [[Zeichenketten]] | ||
|- | |- | ||
| Ein Array wurde 'ByVal' übergeben: Arrays können ausschließlich als Referenz übergeben werden! | | Ein Array wurde 'ByVal' übergeben: Arrays können ausschließlich als Referenz übergeben werden! | ||
| Sub PrintArrayElements( | | | ||
| Sub PrintArrayElements( | <span style="Color:red">Sub PrintArrayElements(byVal strArray() As String)</span> | ||
| | |||
<span style="Color:blue"> Sub </span>PrintArrayElements<span style="Color:gray">(</span><span style="Color:blue">ByRef </span>strArray<span style="Color:gray">()</span><span style="Color:blue"> As String</span><span style="Color:gray">)</span> | |||
| [[Array]] | | [[Array]] | ||
|- | |- | ||
| Ein statisches Array wird als Argument erwartet: Nur dynamische Arrays können an eine Prozedur übergeben werden! | | 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) | <span style="Color:red">Sub PrintArrayElements(ByRef strArray('''7''') As String)</span> | ||
| | |||
<span style="Color:blue"> Sub </span>PrintArrayElements<span style="Color:gray">(</span><span style="Color:blue">ByRef </span>strArray<span style="Color:green">'''()''' As String)</span> | |||
| [[Array]] | | [[Array]] | ||
|- | |- | ||
| Eine falsch formulierte Verneinung mit 'Not': | | Eine falsch formulierte Verneinung mit 'Not': | ||
| If "a" Not = "A" Then If "a" Not Like "A" Then | | | ||
| If Not "a" = "A" Then If Not "a" Like "A" Then | <span style="Color:red">If "a" Not = "A" Then</span> | ||
<span style="Color:red">If "a" Not Like "A" Then</span> | |||
... etc. | |||
| | |||
<span style="Color:blue"> If Not </span><span style="Color:gray">"a"</span> <span style="Color:gray">=</span> <span style="Color:gray">"A"</span><span style="Color:blue"> Then | |||
If Not </span><span style="Color:gray">"a"</span><span style="Color:blue"> Like </span><span style="Color:gray">"A"</span><span style="Color:blue"> Then</span> | |||
... etc. | |||
| [[Abfragen#Vergleich_umkehren_.28Not.29|Abfragen: Vergleich umkehren (Not)]] | | [[Abfragen#Vergleich_umkehren_.28Not.29|Abfragen: Vergleich umkehren (Not)]] | ||
|- | |- | ||
|} | |} | ||
=== Ungültiger Verweis auf Next-Steuervariable === | === Ungültiger Verweis auf Next-Steuervariable === | ||
[[Datei:Fehler_beim_Kompilieren_-_Ungültiger_Verweis_auf_Next-Steuervariable.png]] | [[Datei:Fehler_beim_Kompilieren_-_Ungültiger_Verweis_auf_Next-Steuervariable.png]] | ||
{| class="wikitable" | |||
{| class="wikitable" | |||
|- | |- | ||
! Beispielcode | ! Beispielcode | ||
Zeile 237: | Zeile 375: | ||
! Anmerkungen | ! Anmerkungen | ||
|- | |- | ||
| For lngRow = 1 To 3 For lngColumn = 1 To 5 Next lngRow <span style="Color:green">' lngRow gehört in die äußere Schleife</span> | | | ||
<span style="Color:blue"> For </span>lngRow <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">3</span> | |||
<span style="Color:blue"> For </span>lngColumn <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">5</span> | |||
<span style="Color:blue"> Next </span>lngRow <span style="Color:green">' lngRow gehört in die äußere Schleife</span> | |||
<span style="Color:blue"> Next </span>lngColumn | |||
| | | | ||
<span style="Color:blue"> For </span>lngRow <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">3</span> | |||
<span style="Color:blue"> For </span>lngColumn <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span><span style="Color:gray">5</span> | |||
<span style="Color:blue"> Next </span>lngColumn | |||
<span style="Color:blue"> Next </span>lngRow | |||
| | |||
|} | |} | ||
=== Unzulässige Verwendung einer Eigenschaft === | === Unzulässige Verwendung einer Eigenschaft === | ||
Zeile 247: | Zeile 394: | ||
[[Datei:Fehler_beim_Kompilieren_-_Unzulässige_Verwendung_einer_Eigenschaft.png]] | [[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 = | Dieser Fehler tritt auf, wenn Sie eine Eigenschaft aufrufen, aber weder den Wert abfragen noch diesen setzen: | ||
rngCell<span style="Color:gray">.</span>Font<span style="Color:gray">.</span>Bold <span style="Color:green">' Erzeugt den Fehler</span> | |||
muss vollständig lauten: | |||
rngCell<span style="Color:gray">.</span>Font<span style="Color:gray">.</span>Bold <span style="Color:gray">=</span><span style="Color:blue"> True</span> | |||
oder | |||
blnBold <span style="Color:gray">=</span> rngCell<span style="Color:gray">.</span>Font<span style="Color:gray">.</span>Bold <span style="Color:green">' Wenn Sie wissen möchten, ob der Text fett formatiert ist</span> | |||
Der Fehler wird ebenfalls hier erzeugt: | |||
<span style="Color:blue">If </span>colCollection <span style="Color:gray">=</span> Nothing<span style="Color:blue"> Then Exit Sub | |||
muss lauten: | |||
If </span>colCollection<span style="Color:blue"> Is </span>Nothing<span style="Color:blue"> Then Exit Sub</span> | |||
=== Unzulässige Verwendung eines Objekts === | === Unzulässige Verwendung eines Objekts === | ||
[[Datei:Fehler_beim_Kompilieren_-_Unzulässige_Verwendung_eines_Objekts.png]] | [[Datei:Fehler_beim_Kompilieren_-_Unzulässige_Verwendung_eines_Objekts.png]] | ||
{| class="wikitable" | |||
{| class="wikitable" | |||
|- | |- | ||
! Beispielcode | ! Beispielcode | ||
! Korrigiert | ! Korrigiert | ||
! Anmerkungen | ! Anmerkungen | ||
|- | |- | ||
| If shp = Nothing Then Exit Sub | | | ||
| If shp | <span style="Color:blue"> If </span>shp <span style="Color:gray">=</span> Nothing<span style="Color:blue"> Then Exit Sub</span> | ||
|- | | | ||
<span style="Color:blue"> If </span>shp<span style="Color:blue"> Is </span>Nothing<span style="Color:blue"> Then Exit Sub</span> | |||
| | |||
|- | |||
|} | |} | ||
=== Variable nicht definiert === | === Variable nicht definiert === | ||
[[Datei:Fehler_beim_Kompilieren_-_Variable_nicht_definiert.png]] | [[Datei:Fehler_beim_Kompilieren_-_Variable_nicht_definiert.png]] | ||
* Prüfen Sie, ob die Variable deklariert wurde. | * 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 ... | * Ü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. | ||
* 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 | |||
Beispiele: | |||
<span style="Color:blue"> Dim </span>lngIndex<span style="Color:blue"> As Long</span> | |||
lngEndex <span style="Color:gray">=</span> <span style="Color:gray">2</span> <span style="Color:green">' Falsch geschrieben!</span> | |||
<span style="Color:blue"> Dim </span>colCollection<span style="Color:blue"> As </span>Collection | |||
<span style="Color:blue"> Set </span>colCollection <span style="Color:gray">=</span> Collection <span style="Color:green">' 'New' fehlt, daher interpretiert VBA 'Collection' als Name einer </span> | |||
<span style="Color:green">' nicht deklarierten Variablen ...</span> | |||
* Das geforderte Parent-Objekt zu einem Objekt fehlt. Beispiel PowerPoint: Vor dem Aufruf der 'Selection' wird 'ActiveWindow' erwartet: | |||
Debug<span style="Color:gray">.</span>Print Selection<span style="Color:gray">.</span>ShapeRange<span style="Color:gray">.</span>Count | |||
richtig: | |||
Debug<span style="Color:gray">.</span>Print ActiveWindow<span style="Color:gray">.</span>Selection<span style="Color:gray">.</span>ShapeRange<span style="Color:gray">.</span>Count | |||
=== Variable oder Prozedur anstelle eines Moduls erwartet === | === Variable oder Prozedur anstelle eines Moduls erwartet === | ||
Zeile 275: | Zeile 461: | ||
[[Datei:Fehler_beim_Kompilieren_-_Variable_oder_Prozedur_anstelle_eines_Moduls_erwartet.png]] | [[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: | 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. | ||
** Aus einem anderen Modul heraus müsste stattdessen 'CalculateSomething.CalculateSomething' aufgerufen werden. | |||
** Besser ist jedoch: | |||
* 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. | ||
** Beides ist nun richtig: Der Aufruf 'CalculateSomething' und 'modCalculateSomething.CalculateSomething' | |||
== Laufzeitfehler == | == Laufzeitfehler == | ||
Laufzeitfehler treten erst beim Durchführen einer Programmzeile auf. Oft werden diese Fehler verursacht, weil ein erwarteter Wert nicht den Anforderungen entspricht. | Laufzeitfehler treten erst beim Durchführen einer Programmzeile auf. Oft werden diese Fehler verursacht, weil ein erwarteter Wert nicht den Anforderungen entspricht. | ||
=== 5: Ungültiger Prozeduraufruf oder ungültiges Argument === | |||
[[File:Laufzeitfehler_5_ungültiger.png]] | |||
Tritt auf, wenn Sie einer Prozedur einen falschen Wert übergeben. | |||
;Beispiel: | |||
strText <span style="Color:gray">=</span> Left<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> <span style="Color:gray">-1)</span> <span style="Color:green">' -1 ist kein gültiger Wert für die Left-Funktion</span> | |||
=== 6: Überlauf === | === 6: Überlauf === | ||
Zeile 290: | Zeile 494: | ||
* 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 ). | ||
* wenn die Format-Funktion den übergebenen Wert nicht in das gewünschte Format überführen kann (siehe auch [[Arithmetische_Operatoren_und_Rechenfunktionen#Formatieren|'Arithmetische Operatoren und Rechenfunktionen', 'Formatieren']]: | |||
? Format<span style="Color:gray">("11.01.2000",</span> <span style="Color:gray">"dd.mm.yyyy")</span> <span style="Color:green">' Fehler: Überlauf</span> | |||
=== 9: Index außerhalb des gültigen Bereichs === | === 9: Index außerhalb des gültigen Bereichs === | ||
Zeile 307: | Zeile 513: | ||
[[Datei:Laufzeitfehler_13_-_Typen_unverträglich.png]] | [[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 ... | 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 ... | |||
=== 14: Nicht genügend Zeichenfolgenspeicher === | |||
[[Datei:Laufzeitfehler_14_Nicht_genügend_Zeichenfolgenspeicher.png]] | |||
=== 16: Ausdruck zu komplex === | |||
[[Datei:Laufzeitfehler_16_Ausdruck_zu_komplex.png]] | |||
Dieser Fehler tritt nicht zuverlässig als Reaktion auf einen klaren Umstand in Erscheinung, sondern scheint Speicher-, System- und Tagesformabhägig aufzutreten. | |||
Laut der Hilfe entsteht dieser Fehler, wenn ein Gleitkommaausdruck zuviele verschachtelte Unterausdrücke enthält ... | |||
;Beispiel | |||
Hier wird eine in einer Variablen enthaltener Wert 'sngValue' in einer 'Select Case' Anweisung mit dem Wert des rechten Seitenrandes im aktuellen (Word-)Dokument verglichen. | |||
Der Fehler 16 erschien bei Tests ausschließlich in einer Testumgebung und bei einem von etwa 10 Testdokumenten. Der Fehler war bei diesem Dokument reproduzierbar, ließ sich also beliebig oft wiederholen. | |||
Die Zeile 'Case Is > ...' wurde dabei als fehlerhaft angezeigt. | |||
<span style="Color:blue"> Select Case </span>sngValue | |||
<span style="Color:blue"> Case Is </span><span style="Color:gray">></span> ActiveDocument<span style="Color:gray">.</span>PageSetup<span style="Color:gray">.</span>RightMargin | |||
... | |||
;Lösung | |||
Anstatt den rechten Seitenrand über die Objekte direkt im 'Case'-Zweig abzurufen, wird der Wert vorher in einer Variablen gespeichert und dann entsprechend ausgewertet. | |||
sngRightMargin <span style="Color:gray">=</span> ActiveDocument<span style="Color:gray">.</span>PageSetup<span style="Color:gray">.</span>RightMargin | |||
<span style="Color:blue"> Select Case </span>sngValue | |||
<span style="Color:blue"> Case Is </span><span style="Color:gray">></span> sngRightMargin | |||
... | |||
=== 28: Nicht genügend Stapelspeicher === | === 28: Nicht genügend Stapelspeicher === | ||
Zeile 313: | Zeile 571: | ||
[[Datei:Laufzeitfehler_28_-_Nicht_genügend_Stapelspeicher.png]] | [[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 [[ | 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 [[Rekursionen]]). | |||
=== 52: Dateiname oder -nummer falsch === | |||
[[Datei:Laufzeitfehler_52_Dateiname_oder_nummer_falsch.png]] | |||
Wenn dieser Fehler auftritt und nicht eindeutig gelöst werden kann, bitte folgendes prüfen: | |||
* Dateinummern müssen zwischen 1 und 511 liegen | |||
* Enthält der Dateiname unerlaubte Zeichen? | |||
** Dir(strFileName) gibt einen Leerstring zurück, wenn die Datei nicht existiert | |||
** Dir(strFileName) verursacht den Laufzeitfehler 52, wenn der Dateiname unerlaubte Zeichen enthält | |||
** Diese können auch unsichtbar sein, wie feste Leerzeichen etc. | |||
=== 53: Datei nicht gefunden === | === 53: Datei nicht gefunden === | ||
Zeile 326: | Zeile 598: | ||
[[Datei:Laufzeitfehler_91_-_Objekt_oder_With-Blockvariable_nicht_festgelegt.png]] | [[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" | 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 === | ||
Zeile 332: | Zeile 615: | ||
[[Datei:Laufzeitfehler_424_-_Objekt_erforderlich.png]] | [[Datei: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) | Neben den in der Hilfe aufgeführten Gründen (z. B. der Zugriff auf eine Eigenschaft ohne Angabe des Objektqualifizierers) tritt diese Fehlermeldung ebenfalls auf, wenn Sie versuchen, eine schreibgeschützte Eigenschaft zu überschreiben: | ||
ActiveCell.Left = 34 | |||
Die 'Left'-Eigenschaft einer Zelle kann nur abgefragt, aber nicht gesetzt werden, denn sie ist schreibgeschützt (sie ergibt sich aus den Positionen und Breiten der vorangegangenen Spalten). | |||
Aus gleichem Grund tritt diese Fehlermeldung ebenfalls auf, wenn Sie versuchen, den Wert eines Elementes einer Auflistung (Collection) nachträglich zu ändern: | |||
colTest<span style="Color:gray">.</span>Item<span style="Color:gray">(2)</span> <span style="Color:gray">=</span> <span style="Color:gray">"Second Item"</span> <span style="Color:green">' Fehler 424: Objekt erforderlich</span> | |||
Die 'Item'-Eigenschaft einer Auflistung ist schreibgeschützt (siehe [[Collection#Wert_.C3.BCberschreiben|Element einer Auflistung überschreiben]]). | |||
=== 429: Objekterstellung durch ActiveX-Komponente nicht möglich === | === 429: Objekterstellung durch ActiveX-Komponente nicht möglich === | ||
Zeile 338: | Zeile 631: | ||
[[Datei:Laufzeitfehler_429_-_Objekterstellung_durch_ActiveX-Komponente_nicht_möglich.png]] | [[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 | Dieser Fehler tritt auf, wenn Sie versuchen, mit | ||
* 'GetObject' auf eine Anwendung zuzugreifen, die nicht läuft (siehe [[Fernsteuerung]]) | |||
* 'New' ein Anwendungs-Objekt zu erstellen (siehe [[Anwendungsobjekte]]) | |||
=== 457: Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet === | === 457: Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet === | ||
Zeile 344: | Zeile 639: | ||
[[Datei:Laufzeitfehler_457_-_Dieser_Schlüssel_ist_bereits_einem_Element_der_Auflistung_zugeordnet.png]] | [[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" | 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 === | ||
Zeile 350: | Zeile 651: | ||
[[Datei:Laufzeitfehler_1004_-_Anwenungs_oder_objektdefinierter_Fehler.png]] | [[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 ... | 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. === | ||
Zeile 362: | Zeile 666: | ||
[[Datei:Laufzeitfehler_5941_-_Das_angeforderte_Element_ist_nicht_in_der_Sammlung_vorhanden.png]] | [[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 | 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 372: | Zeile 679: | ||
[[Datei:Nach_diesem_Vorgang_wird_das_Projekt_zurückgesetzt.png]] | [[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! | 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 ==== | ||
Zeile 378: | Zeile 687: | ||
[[Datei:Projekt_kann_nicht_angezeigt_werden.png]] | [[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. | 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 386: | Zeile 697: | ||
==== Leider kann 'Datei' nicht geöffnet werden, da der Inhalt Probleme verursacht ==== | ==== Leider kann 'Datei' nicht geöffnet werden, da der Inhalt Probleme verursacht ==== | ||
[[Datei:Leider_kann_'Datei'_nicht_geöffnet_werden_da_der_Inhalt_Probleme_verursacht.png]] [[Datei:Leider_kann_'Datei'_nicht_geöffnet_werden_da_der_Inhalt_Probleme_verursacht_Deatails.png]] | [[Datei:Leider_kann_'Datei'_nicht_geöffnet_werden_da_der_Inhalt_Probleme_verursacht.png]] [[Datei:Leider_kann_'Datei'_nicht_geöffnet_werden_da_der_Inhalt_Probleme_verursacht_Deatails.png]] | ||
==== Von Anwendung wurde nicht lesbarer Inhalt in Datei gefunden ==== | ==== Von Anwendung wurde nicht lesbarer Inhalt in Datei gefunden ==== | ||
Zeile 407: | Zeile 718: | ||
[[Datei:Wir_konnten_die_Datei_nicht_finden.png]] | [[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. | 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. |
Aktuelle Version vom 28. Januar 2023, 00:31 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
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
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
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
Ein Benutzerdefinierter Datentyp 'Type' muss mindestens ein Element enthalten.
Compilerfehler im ausgeblendeten Modul
Datenfeldargument muß als Referenz (ByRef) übergeben werden
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 strArray() as String) ' Erzeugt den oben genannten Kompilierfehler
Beachten Sie jedoch bei der Übergabe als Referenz folgendes: Variablen: Übergabeparameter
Erwartet: )
Diese Fehlermeldung erscheint in folgenden Situationen:
- Funktionen dürfen keine statischen Arrays zurückgeben (siehe Array: Rückgabewert einer Funktion):
Private Function LoadData() As String(3) ' Falsch! :-( Private Function LoadData() As String() ' Korrekt!! :-)
Funktionsaufruf auf der linken Seite der Zuweisung muss den Typ Variant oder Object zurückgeben
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
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!
Kompilerfehler im ausgeblendeten Modul
Siehe Compilerfehler im ausgeblendeten Modul
Mehrdeutiger Name
Wahrscheinlich wurden mehrere Prozeduren mit dem gleichen Namen angelegt.
Bedenken Sie, dass dieser Fehler auch auftritt, wenn öffentliche Prozeduren in verschiedenen Modulen den gleichen Namen tragen!
Mehrfachdeklaration im aktuellen Gültigkeitsbereich
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
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, also oberhalb aller Prozeduren!
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
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.
Bitte beachten: Der Hinweis auf 'öffentliche Objektmodule' ist hier irreführend, denn egal wo oder wie Sie einen benutzerdefinierten Datentyp deklarieren, er kann nicht in einen Variant umgewandelt werden.
Tipp: Verwenden Sie in diesem Falle statt der Collection ein Array oder statt des Datentyps 'Type' eine Datenklasse!
Objekt erforderlich
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
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
- Ü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
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
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
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
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
Beispielcode | Korrigiert | Anmerkungen |
---|---|---|
If shp = Nothing Then Exit Sub |
If shp Is Nothing Then Exit Sub |
Variable nicht definiert
- 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
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.
- Aus einem anderen Modul heraus müsste stattdessen 'CalculateSomething.CalculateSomething' aufgerufen werden.
- Besser ist jedoch:
- Das Modul 'modCalculateSomething' enthält eine Prozedur 'CalculateSomething'. Hier gibt es keinen Konflikt und keine Fehlermeldung.
- Beides ist nun richtig: Der Aufruf 'CalculateSomething' und 'modCalculateSomething.CalculateSomething'
Laufzeitfehler
Laufzeitfehler treten erst beim Durchführen einer Programmzeile auf. Oft werden diese Fehler verursacht, weil ein erwarteter Wert nicht den Anforderungen entspricht.
5: Ungültiger Prozeduraufruf oder ungültiges Argument
Tritt auf, wenn Sie einer Prozedur einen falschen Wert übergeben.
- Beispiel
strText = Left(strText, -1) ' -1 ist kein gültiger Wert für die Left-Funktion
6: Überlauf
Dieser Fehler tritt auf,
- wenn Sie einer ganzzahligen Variablen einen zu großen Wert zuweisen.
- wenn Sie Null durch Null teilen ( 0 / 0 ).
- wenn die Format-Funktion den übergebenen Wert nicht in das gewünschte Format überführen kann (siehe auch 'Arithmetische Operatoren und Rechenfunktionen', 'Formatieren':
? Format("11.01.2000", "dd.mm.yyyy") ' Fehler: Überlauf
9: Index außerhalb des gültigen Bereichs
Tritt zum Beispiel dann auf, wenn Sie versuchen, auf ein nicht existierendes Element einer Collection zuzugreifen.
11: Division durch Null
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
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 ...
14: Nicht genügend Zeichenfolgenspeicher
16: Ausdruck zu komplex
Dieser Fehler tritt nicht zuverlässig als Reaktion auf einen klaren Umstand in Erscheinung, sondern scheint Speicher-, System- und Tagesformabhägig aufzutreten.
Laut der Hilfe entsteht dieser Fehler, wenn ein Gleitkommaausdruck zuviele verschachtelte Unterausdrücke enthält ...
- Beispiel
Hier wird eine in einer Variablen enthaltener Wert 'sngValue' in einer 'Select Case' Anweisung mit dem Wert des rechten Seitenrandes im aktuellen (Word-)Dokument verglichen.
Der Fehler 16 erschien bei Tests ausschließlich in einer Testumgebung und bei einem von etwa 10 Testdokumenten. Der Fehler war bei diesem Dokument reproduzierbar, ließ sich also beliebig oft wiederholen.
Die Zeile 'Case Is > ...' wurde dabei als fehlerhaft angezeigt.
Select Case sngValue Case Is > ActiveDocument.PageSetup.RightMargin ...
- Lösung
Anstatt den rechten Seitenrand über die Objekte direkt im 'Case'-Zweig abzurufen, wird der Wert vorher in einer Variablen gespeichert und dann entsprechend ausgewertet.
sngRightMargin = ActiveDocument.PageSetup.RightMargin Select Case sngValue Case Is > sngRightMargin ...
28: Nicht genügend Stapelspeicher
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 Rekursionen).
52: Dateiname oder -nummer falsch
Wenn dieser Fehler auftritt und nicht eindeutig gelöst werden kann, bitte folgendes prüfen:
- Dateinummern müssen zwischen 1 und 511 liegen
- Enthält der Dateiname unerlaubte Zeichen?
- Dir(strFileName) gibt einen Leerstring zurück, wenn die Datei nicht existiert
- Dir(strFileName) verursacht den Laufzeitfehler 52, wenn der Dateiname unerlaubte Zeichen enthält
- Diese können auch unsichtbar sein, wie feste Leerzeichen etc.
53: Datei nicht gefunden
- 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
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
Neben den in der Hilfe aufgeführten Gründen (z. B. der Zugriff auf eine Eigenschaft ohne Angabe des Objektqualifizierers) tritt diese Fehlermeldung ebenfalls auf, wenn Sie versuchen, eine schreibgeschützte Eigenschaft zu überschreiben:
ActiveCell.Left = 34
Die 'Left'-Eigenschaft einer Zelle kann nur abgefragt, aber nicht gesetzt werden, denn sie ist schreibgeschützt (sie ergibt sich aus den Positionen und Breiten der vorangegangenen Spalten).
Aus gleichem Grund tritt diese Fehlermeldung ebenfalls auf, wenn Sie versuchen, den Wert eines Elementes einer Auflistung (Collection) nachträglich zu ändern:
colTest.Item(2) = "Second Item" ' Fehler 424: Objekt erforderlich
Die 'Item'-Eigenschaft einer Auflistung ist schreibgeschützt (siehe Element einer Auflistung überschreiben).
429: Objekterstellung durch ActiveX-Komponente nicht möglich
Dieser Fehler tritt auf, wenn Sie versuchen, mit
- 'GetObject' auf eine Anwendung zuzugreifen, die nicht läuft (siehe Fernsteuerung)
- 'New' ein Anwendungs-Objekt zu erstellen (siehe Anwendungsobjekte)
457: Dieser Schlüssel ist bereits einem Element der Auflistung zugeordnet
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
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.
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
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
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
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
Von Anwendung wurde nicht lesbarer Inhalt in Datei gefunden
Word spezifische Fehler
Diese Dokumentvorlage kann von Word nicht geöffnet werden
Dieser Fehler tritt beim Starten von Word auf:
- Die hier angegebene globale Dokumentvorlage kann nicht geöffnet werden.
- Ein möglicher Grund besteht darin, dass eine Änderung an der OOXML-Datei Probleme verursacht.
- Siehe auch Fehlermeldungen bei selbst erstellten Menübändern.
Wir konnten die Datei nicht finden
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.