VBA-Automatisierungsfehler
In this Article
In diesem Tutorial wird erklärt, was ein VBA-Automatisierungsfehler bedeutet und wie er auftritt.
Excel besteht aus Objekten, und zwar dem Workbook-Objekt, Worksheet-Objekt, Range-Objekt und Cell-Objekt, um nur einige zu nennen. Jedes Objekt hat mehrere Eigenschaften und Methoden, deren Verhalten mit VBA-Code gesteuert werden kann. Wenn der VBA-Code nicht korrekt programmiert ist, kann ein Automatisierungsfehler auftreten. Dies ist einer der frustrierendsten Fehler in VBA, da er oft ohne ersichtlichen Grund auftritt, obwohl Ihr Code völlig in Ordnung aussieht!
(Weitere Informationen zu VBA-Fehlern finden Sie in unserer Anleitung zur Fehlerbehandlung )
Verweis auf eine nicht mehr aktive Variable
Ein Automatisierungsfehler kann auftreten, wenn Sie über eine Variable, die nicht mehr aktiv ist, auf eine Arbeitsmappe oder ein Arbeitsblatt verweisen.
Sub AutomatisierungTesten()
Dim strDatei As String
Dim wb As Workbook
'Datei öffnen und Arbeitsmappenvariable festlegen
strDatei = Application.GetOpenFilename
Set wb = Workbooks.Open(strDatei)
'Arbeitsmappe schließen
wb.Close
'Versuchen, die Arbeitsmappe zu aktivieren
wb.Activate
End Sub
Wenn wir den obigen Code ausführen, erhalten wir einen Automatisierungsfehler. Das liegt daran, dass wir eine Arbeitsmappe geöffnet und ihr eine Variable zugewiesen haben. Dann haben wir die Arbeitsmappe geschlossen, aber in der nächsten Codezeile versuchen wir, die geschlossene Arbeitsmappe zu aktivieren. Dies führt zu dem Fehler, da die Variable nicht mehr aktiv ist.
Wenn wir eine Arbeitsmappe aktivieren wollen, müssen wir sie zuerst öffnen!
Speicherüberlastung
Dieser Fehler kann auch auftreten, wenn Sie eine Schleife haben und vergessen, ein Objekt im Laufe der Schleife zu löschen. Es kann jedoch sein, dass er nur manchmal auftritt und in anderen Fällen nicht. Das ist einer der Gründe, warum dieser Fehler so ärgerlich sein kann.
Nehmen Sie zum Beispiel den folgenden Code:
Sub BildEinfuegen()
Dim i As Integer
Dim shp As Object
For i = 1 To 100
With Worksheets("Tabelle1")
'Die Objektvariable festlegen
Set shp = .OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, DisplayAsIcon:=False, Left:=.Cells(i, "A").Left, Top:=.Cells(i, "A").Top, Width:=264, Height:=124)
End With
With shp
.Object.PictureSizeMode = 3
'Das Bild laden
.Object.Picture = LoadPicture("C:dataimage" & i & ".jpg")
.Object.BorderStyle = 0
.Object.BackStyle = 0
End With
Next i
End Sub
Die Variable wird als Objekt deklariert und dann wird das Schlüsselwort SET verwendet, um dem Objekt ein Bild zuzuweisen. Das Objekt wird dann mit einem Bild belegt und in das Excel-Blatt eingefügt, wobei einige Formatierungen gleichzeitig vorgenommen werden. Wir fügen dann eine Schleife in den Code ein, um 100 Bilder in das Excel-Blatt einzufügen. Gelegentlich führt dies zu einem Automatisierungsfehler, manchmal aber auch nicht. Frustrierend, oder?
Die Lösung für dieses Problem besteht darin, die Objektvariable innerhalb der Schleife zu löschen, indem das Objekt auf NOTHING gesetzt wird. Auf diese Weise wird der Speicher freigegeben und der Fehler vermieden.
Sub BildEinfuegen()
Dim i As Integer
Dim shp As Object
For i = 1 To 100
With Worksheets("Tabelle1")
'Die Objektvariable festlegen
Set shp = .OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, DisplayAsIcon:=False, Left:=.Cells(i, "A").Left, Top:=.Cells(i, "A").Top, Width:=264, Height:=124)
End With
With shp
.Object.PictureSizeMode = 3
'Das Bild laden
.Object.Picture = LoadPicture("C:dataimage.jpg")
.Object.BorderStyle = 0
.Object.BackStyle = 0
End With
'Die Objektvariable löschen
Set shp = Nothing
Next i
End Sub
DLL-Fehler und Aktualisierung von Windows
Manchmal tritt der Fehler auf und es gibt nichts, was innerhalb des VBA-Codes getan werden kann. Die Neuregistrierung der verwendeten DLLs, die Überprüfung, ob Windows auf dem neuesten Stand ist, und als letzter Ausweg die Durchführung einer Registrierungsprüfung sind manchmal die einzigen Maßnahmen, die diesen Fehler beheben können.
Eine gute Möglichkeit, diesen Fehler zu vermeiden, besteht darin, dafür zu sorgen, dass mit den Routinen On Error Go To oder On Error Resume Next Fehler abgefangen werden.