Tipp 0411
|
Excel-Automatisierungsfehler vermeiden
|
 |
|
Autor/Einsender: Datum: |
|
Angie 29.08.2004 |
|
Entwicklungsumgebung: |
|
VB/VBA |
|
|
Bei der Automation von Excel 97 oder höher kann es unter anderem zu einer der folgenden
Fehlermeldungen kommen:
|
|
|
Laufzeitfehler '1004'
Method '<name of method>' of object '_Global' failed
- oder -
Application-defined or object-defined error
|
|
|
Bei der Automation von Excel 95:
|
|
|
Laufzeitfehler '462'
Der Remote-Server-Computer existiert nicht oder ist nicht
verfügbar.
|
|
|
Ursache der Fehlermeldungen |
|
Auf Grund eines Zugriffs auf ein Excel-Objekt, eine -Methode oder -Eigenschaft ohne
einen gültigen Objektverweis, hat Visual Basic einen Verweis zu Excel eingerichtet,
der erst wieder freigegeben wird, wenn das Programm beendet wird. Dieser fehlerhafte
Verweis verursacht die obigen Fehlermeldungen, wenn der Code mehr als einmal
ausgeführt wird.
|
|
|
Ändern Sie den Code so, dass jeder Aufruf eines Excel-Objekts, einer -Methode oder
-Eigenschaft durch die entsprechende Objektvariable definiert wird.
|
|
|
Zur Automation von Microsoft Excel legen Sie Objektvariablen fest, die normalerweise auf
das Application-Objekt (Excel-Anwendung) und auf ein
Workbook-Objekt (Arbeitsmappe) verweisen. Selbstverständlich können
auch weitere Objektvariablen festgelegt werden, die beispielsweise auf ein Tabellenblatt
(Worksheet), einen Bereich (Range) oder andere Objekte im Excel-Objektmodell
verweisen.
|
Wenn im Code ein Excel-Objekt, eine -Methode oder -Eigenschaft verwendet wird, sollte der Aufruf
nur in Verbindung mit einer entsprechenden Objektvariable erfolgen. Fehlt diese Objektvariable,
legt Visual Basic eine verborgene globale Variable für die aktuell ausgeführte Instanz fest.
|
Wird Excel beendet oder die deklarierte Objektvariable freigegeben, verweist die verborgene globale
Variable auf ein ungültiges (zerstörtes) Objekt. Bei erneutem Ausführen des Automatisierungscodes,
schlagen Aufrufe zu der verborgenen Objektvariable fehl.
|
|
Beispiel mit fehlerhaftem Code |
|
Mit folgendem Beispiel kann der Fehler reproduziert werden.
|
Für die Ausführung des Codes muss zur Entwurfszeit die entsprechende
Microsoft Excel x.0 Object Library in das Projekt eingebunden werden.
|
|
|
Sub Demo_ExcelAutomationError()
1: Dim objXLApp As Excel.Application
2: Dim objXLWkb As Excel.Workbook
3: Dim objXLWks As Excel.Worksheet
4: Set objXLApp = CreateObject("Excel.Application")
5: objXLApp.Visible = True
6: Set objXLWkb = objXLApp.Workbooks.Add
7: Set objXLWks = objXLWkb.Worksheets(1)
8: objXLWks.Range(Cells(1, 1), Cells(1, 1)).Value = "Hi"
9: Set objXLWks = Nothing
10: With objXLWkb
11: .Saved = True
12: .Close
13: End With
14: Set objXLWkb = Nothing
15: objXLApp.Quit
16: Set objXLApp = Nothing
End Sub
|
|
|
Führen Sie die Prozedur das erste Mal aus, tritt kein Fehler auf. Es wurde jedoch auf Grund
fehlender Objektkennzeichner in der Codezeile 8 ein Verweis zu Excel erstellt, der
nicht wieder freigegeben wurde.
|
Bei erneutem Aufruf der Prozedur tritt der oben beschriebene Fehler in Codezeile 8
auf, da bei der Cells-Methode (in zwei Fällen) der Objektkennzeichner
objXLWks für das Tabellenblatt fehlt.
|
Ändern Sie
|
|
|
8: objXLWks.Range(Cells(1, 1), Cells(1, 1)).Value = "Hi"
|
|
|
|
|
8: objXLWks.Range(objXLWks.Cells(1, 1), _
objXLWks.Cells(1, 1)).Value = "Hi"
|
|
|
|
|
8: With objXLWks
.Range(.Cells(1, 1), .Cells(1, 1)).Value = "Hi"
End With
|
|
|
Nach Änderung der Codezeile 8 kann die Prozedur immer wieder fehlerfrei ausgeführt werden.
|
|
|
Wurde im Projekt ein Verweis auf die Microsoft Excel x.0 Object Library gesetzt, stehen die
Beispiele für die Objekte, Methoden und Eigenschaften des Excel-Objektmodells in der
Excel-VB(A)-Hilfe-Datei zur Verfügung. Befindet sich der Cursor im Code in einem Schlüsselwort,
kann die Hilfe mit der Taste [F1] aufgerufen werden.
|
Die Beispiele in den Hilfethemen sind jedoch für Excel VBA (Visual Basic for
Applications) und müssen für die Automation von Excel mit den entsprechenden
Objektkennzeichnern ergänzt werden.
|
Beispiel Cells-Eigenschaft in der Excel-VB(A)-Hilfe
|
|
|
Worksheets("Sheet1").Activate
Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True
|
|
|
Beispiel für die Automation von Excel
(in Anlehnung an die Objektvariablen in obigem Beispiel)
|
|
|
With objXLWks
.Range(.Cells(1, 1), .Cells(5, 3)).Font.Italic = True
End With
|
|
|
|
Teile dieses Artikels sind eine freie Übersetzung des englischsprachigen Artikels
der Microsoft Knowledge Base: |
178510 |
Excel automation fails second time code runs |
|
|
|