Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Fehler 1004 Methode fehlgeschlagen

Forumthread: Fehler 1004 Methode fehlgeschlagen

Fehler 1004 Methode fehlgeschlagen
03.01.2004 03:30:12
Frank Holiet
Hallo zusammen,

wahrscheinlich ist es eine Zumutung, daß ich den gesaamten Code hier schreibe, aber ich komme einfach nicht mehr weiter.

Das Problem ist, daß der erste Durchlauf dieses Codes völlig unproblematisch ist, doch beim 2. Durchlauf kommt die Fehlermeldung 1004. Die Methode Cells für das Objekt '_Application' ist fehlgeschlagen.

Kann mir jemand eine Hilfestellung geben, wo der Fehler sitzt?

Ganz herzlichen Dank schon vorab!!
Frank


Private Sub ExportmeineTabelle_Click()
Dim oExcel As Excel.Application, DB As DAO.Database, RS As DAO.Recordset, I As Long
Dim XLExport As Object
Dim Datei1
On Error Resume Next
' Löschen der Excel-Tabelle, falls bereits vorhanden
Datei1 = Dir("c:\temp\meineTabelle.xls")
If Datei1 <> "" Then
Kill "c:\temp\meineTabelle.xls"
Else: Resume Next
End If
' öffnet Excel, wenn noch nicht geöffnet
Err.Clear
Set oExcel = GetObject(, "Excel.Application ")
If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
On Error GoTo 0
With oExcel
.Visible = True
' Import der DBase-Tabelle, abspeichern im Excel-Format
Workbooks.Open FileName:="C:\TEMP\meineTabelle.dbf"
ActiveWorkbook.SaveAs FileName:="C:\TEMP\meineTabelle.xls", FileFormat:=xlNormal
ActiveWorkbook.Close (False)
.Application.Quit
End With
'Löschen der dBase-Tabelle, falls bereits vorhanden
Datei1 = Dir("c:\temp\meineTabelle.dbf")
If Datei1 <> "" Then
Kill "c:\temp\meineTabelle.dbf"
End If
' füllt die Export-Tabelle "tbldBase" mit Daten aus CAQ und dBase-File
DoCmd.SetWarnings False
DoCmd.OpenQuery "qryExcel1"
DoCmd.SetWarnings True
' zurück zu Excel
With oExcel
.Visible = True
' Laden der Vorlage (notwendig, weil dBase Zahlenformate nicht anerkennt)
Set XLExport = GetObject("C:\TEMP\meineTabelle.xlt")
' Microsoft Excel mit zugehöriger Application-Eigenschaft einblenden
XLExport.Application.Visible = True
XLExport.Parent.Windows(1).Visible = True
' zurück zu Access, Verweis auf DB, Öffnen des Recordsets im Snapshot-Format
Set DB = CurrentDb
Set RS = DB.OpenRecordset("tblDBase", dbOpenSnapshot)
' Feldnamen als Überschriften ins Excel übertragen
For I = 0 To RS.Fields.Count - 1
.Cells(1, I + 1) = RS.Fields(I).Name
Next I
.Range("A2").Select
.Selection.CopyFromRecordset RS
' Excel Tabelle in dBaseIV konvertieren und speichern
.ActiveWorkbook.SaveAs FileName:="C:\Temp\meineTabelle.dbf", FileFormat:=xlDBF4
.ActiveWorkbook.Close (False)
.Application.Quit
End With
' Verweis auf Anwendung und Tabellen freigeben.
Set RS = Nothing
Set DB = Nothing
Set XLExport = Nothing
Set oExcel = Nothing
' Löschen der Datensätze der Access-Tabelle "tblDBase
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE tblDBase.* FROM tblDBase;"
DoCmd.SetWarnings True
End Sub

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler 1004 Methode fehlgeschlagen
03.01.2004 09:59:51
Hajo_Zi
Hallo Frank

ich habe mir den Code nicht angesehen. Abe die Zeilen

' Verweis auf Anwendung und Tabellen freigeben.
Set RS = Nothing
Set DB = Nothing
Set XLExport = Nothing
Set oExcel = Nothing

' Löschen der Datensätze der Access-Tabelle "tblDBase
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE tblDBase.* FROM tblDBase;"
DoCmd.SetWarnings True
erden nicht mehr ausgeführt.

Ist der Code in der ActiveWorkbook wird Application.Quit auch nicht mehr ausgeführt.

Bitte keine Mail, Probleme sollten im Forum gelöst werden.

Microsoft MVP für Excel

Das Forum lebt auch von den Rückmeldungen.
Betriebssystem XP Pro und Excel Version XP Pro


Anzeige
AW: Fehler 1004 Methode fehlgeschlagen
03.01.2004 12:26:50
Dieter Klemke
Hallo Frank,
ich habe deinen Code nicht ganz durchschaut, aber die folgende Stelle ist sicher problematisch:
Wenn du in dem Programmteil

With oExcel
.Visible = True

' Import der DBase-Tabelle, abspeichern im Excel-Format
Workbooks.Open FileName:="C:\TEMP\meineTabelle.dbf"
ActiveWorkbook.SaveAs FileName:="C:\TEMP\meineTabelle.xls", FileFormat:=xlNormal
ActiveWorkbook.Close (False)
.Application.Quit
End With

die Anwendung Excel schließt, dann kannst du sie nicht einfach mit

' zurück zu Excel
With oExcel
.Visible = True
...
End With

wieder öffnen.

Um in der gestarteten Excel-Anwendung eine neue Arbeitsmappe nach dem Muster "C:\TEMP\meineTabelle.xlt" anzulegen, kannst du anstelle von
Set XLExport = GetObject("C:\TEMP\meineTabelle.xlt")
schreiben
Set XLExport = oExcel.Workbooks.Add(Template:="C:\TEMP\meineTabelle.xlt")
XLExport ist vom Typ Workbook.
Damit müßte es sich eigentlich problemlos weiterarbeiten lassen.
Z.B. XLExport.Worksheets(1).Cells(1, I + 1) = RS.Fields(I).Name

MfG
Dieter
Anzeige
AW: Fehler 1004 Methode fehlgeschlagen
04.01.2004 01:01:16
Frank Holiet
Hallo Dieter,

zunächst einmal herzlichen Dank für Deine konkrete Hilfe!

Ich habe den Code Deiner Empfehlung entsprechend geändert, jetzt wird allerdings der Recordset nicht in die Vorlage kopiert. Es kommt eine Fehlermeldung, daß die Copy-Methode des Worksheet-Objekts nicht ausgeführt werden konnte. Es handelt sich dabei um die letzte Zeile. Er kennt weder den Befehl Selection.CopyFromRecordset RS noch den hier benutzen Copy RS. Könntest du mir weiterhelfen ;-)))

Nochmals vielen Dank.
Gruß
Frank

Set XLExport = oExcel.Workbooks.Add(Template:="C:\TEMP\meineTabelle.xlt")

' Microsoft Excel mit zugehöriger Application-Eigenschaft einblenden
XLExport.Application.Visible = True
XLExport.Parent.Windows(1).Visible = True

' zurück zu Access, Verweis auf DB, Öffnen des Recordsets im Snapshot-Format
Set DB = CurrentDb
Set RS = DB.OpenRecordset("tblDBase", dbOpenSnapshot)

' Feldnamen als Überschriften ins Excel übertragen
For I = 0 To RS.Fields.Count - 1
XLExport.Worksheets(1).Cells(1, I + 1) = RS.Fields(I).Name
Next I
XLExport.Worksheets(1).Range("A2").Select
XLExport.Worksheets(1).Copy RS
Anzeige
AW: Fehler 1004 Methode fehlgeschlagen
04.01.2004 08:44:44
Dieter Klemke
Hallo Frank,
ob "Selection.CopyFromRecordset RS" funktioniert, hängt davon ab, was Selection für ein Objekt ist. Du kannst das mit "MsgBox TypeName(Selection)" testen. Selection muss ein Range-Objekt sein.
"XLExport.Worksheets(1).Range("A2").Select" funktioniert nur, wenn XLExport.Worksheets(1)
das aktive Blatt ist.
"XLExport.Worksheets(1).Copy RS" kann nicht funktionieren, da die Copy-Methode des Worksheet-Objektes das Blatt kopiert und ganz andere Parameter erwartet.
Du musst hier schreiben:
"XLExport.Worksheets(1).Range("A2").CopyFromRecordset RS"
Eleganter ist es, wenn du einmal setzt "Set ws = XLExport.Worksheets(1)" (Dim ws As Excel.Worksheet) und dann immer nur ws verwendest, z.B.
"ws.Range("A2").CopyFromRecordset RS"

MfG
Dieter

P.S.
Den Teil
' Microsoft Excel mit zugehöriger Application-Eigenschaft einblenden
XLExport.Application.Visible = True
XLExport.Parent.Windows(1).Visible = True
kannst du vermutlich weglassen, da die Excel-Application oExcel schon früher sichtbar geschaltet wurde. Außerdem muss sie für die vorliegende Verarbeitung nicht unbedingt sichtbar sein.
Anzeige
AW: Fehler 1004 Methode fehlgeschlagen
05.01.2004 06:35:16
Frank Holiet
Hallo Dieter,

ohne die Hilfe des Forums, d.h. insbesondere deiner Hilfe hätte ich es nie geschafft, das Problem zu löschen. Vielen Dank.

Restfehler ist jetzt noch, daß sich Excel nicht automatisch beenden läßt, sondern für jede Art der Beendigung, die ich bisher ausprobiert habe, eine Fehlermeldung bringt. Könntest Du mir noch ein letztes Mal helfen?

ws.SaveAs FileName:="C:\Temp\meine Tabelle.dbf", FileFormat:=xlDBF4
oExcel.Application.Quit

funktioniert nicht, weil dann immer noch gefragt wird, ob gespeichert werden soll und kein False o.ä. wird akzeptiert. Für die nächste Zeit habe ich wirklich die Nase voll von Excel, jede Datenbank ist einfacher.

Mit bestem Gruß
Frank
Anzeige
AW: Fehler 1004 Methode fehlgeschlagen
05.01.2004 10:25:05
Dieter Klemke
Hallo Frank,
wenn beim Quit noch eine vorsorgliche Speicherabfrage kommt, dann ist sicher noch eine Arbeitsmappe offen, die du verändert, aber noch nicht gespeichert hast.
Das Problem lässt sich auf verschiedenen Wegen beheben.

a) Dich interessiert nicht, um welche Arbeitsmappe es sich handelt und du unterdrückst die vorsorgliche Speicherabfrage folgendermaßen:
oExcel.DisplayAlerts = False
oExcel.Quit
(Es reicht anstelle von "oExcel.Application.Quit" zu schreiben "oExcel.Quit")

b) Du schließt die betreffende(n) Datei(en), für die die Speicherungsabfrage angezeigt wird vor dem Quit mit oder ohne vorherige Speicherung (Parameter SaveChanges):
oExcel.Workbooks("DateiXY.xls").Close SaveChanges:=True
oExcel.Quit

Falls du Zweifel bzgl. der noch geöffneten Arbeitsmappe hast, solltest du noch mal deinen gesamten Code posten.

MfG
Dieter
P.S.
Excel-VBA ist nicht so schlecht, wie du im Moment meinst. Natürlich musst du hier "dateiorientierter" denken als bei einer Datenbank.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Fehler 1004 in Excel VBA: Lösungen und Tipps


Schritt-für-Schritt-Anleitung

Um den Fehler 1004 in Excel VBA zu beheben, folge diesen Schritten:

  1. Code Überprüfung: Überprüfe den Code auf Stellen, an denen das Excel-Objekt möglicherweise nicht korrekt angesprochen wird. Achte auf die Zeilen, die das Schließen von Excel betreffen, wie .Application.Quit.

  2. Fehlerbehandlung: Füge On Error Resume Next hinzu, um die Ausführung bei einem Fehler fortzusetzen. Stelle sicher, dass du anschließend den Fehler zurücksetzt.

  3. Verwendung von Set: Stelle sicher, dass du Objekte korrekt mit Set initialisierst. Beispielsweise:

    Dim oExcel As Excel.Application
    Set oExcel = CreateObject("Excel.Application")
  4. Korrekte Nutzung von CopyFromRecordset: Stelle sicher, dass du die Methode CopyFromRecordset korrekt anwendest. Anstelle von:

    Selection.CopyFromRecordset RS

    solltest du verwenden:

    ws.Range("A2").CopyFromRecordset RS
  5. Speichern und Schließen: Verwende oExcel.DisplayAlerts = False, um Speicherabfragen zu unterdrücken, bevor du Excel schließt:

    oExcel.DisplayAlerts = False
    oExcel.Quit

Häufige Fehler und Lösungen

  1. Fehler 1004: Methode fehlgeschlagen: Dieser Fehler tritt häufig auf, wenn Excel versucht, auf ein Objekt zuzugreifen, das nicht existiert oder nicht verfügbar ist. Überprüfe den Code auf falsche Referenzen.

  2. ActiveWorkbook nicht verfügbar: Wenn du versuchst, ActiveWorkbook zu verwenden, nachdem Excel geschlossen wurde, tritt ebenfalls der Fehler auf. Stelle sicher, dass die Excel-Anwendung offen bleibt, bis alle Operationen abgeschlossen sind.

  3. Speicherabfrage beim Schließen von Excel: Wenn du beim Schließen von Excel eine Speicherabfrage erhältst, kann dies daran liegen, dass eine Arbeitsmappe ohne Speichern geschlossen wird. Verwende oExcel.Workbooks("Dateiname.xlsx").Close SaveChanges:=True, um das Problem zu lösen.


Alternative Methoden

  • Verwendung von Workbooks.Add: Anstatt GetObject für eine Vorlage zu nutzen, kannst du eine neue Arbeitsmappe mit einer Vorlage erstellen. Beispiel:

    Set XLExport = oExcel.Workbooks.Add(Template:="C:\TEMP\meineTabelle.xlt")
  • Vermeidung von Selection: Anstelle von Selection ist es oft besser, direkt auf das Arbeitsblatt zuzugreifen, um Missverständnisse zu vermeiden. Beispiel:

    Dim ws As Excel.Worksheet
    Set ws = XLExport.Worksheets(1)

Praktische Beispiele

Hier ist ein Beispielcode, der die oben genannten Punkte umsetzt:

Private Sub ExportmeineTabelle_Click()
    Dim oExcel As Excel.Application
    Dim XLExport As Workbook
    Dim RS As DAO.Recordset
    Dim I As Long

    Set oExcel = New Excel.Application
    oExcel.Visible = True
    Set XLExport = oExcel.Workbooks.Add(Template:="C:\TEMP\meineTabelle.xlt")

    ' Beispiel zur Verwendung von CopyFromRecordset
    Set RS = CurrentDb.OpenRecordset("tblDBase", dbOpenSnapshot)
    For I = 0 To RS.Fields.Count - 1
        XLExport.Worksheets(1).Cells(1, I + 1).Value = RS.Fields(I).Name
    Next I
    XLExport.Worksheets(1).Range("A2").CopyFromRecordset RS

    oExcel.DisplayAlerts = False
    XLExport.SaveAs "C:\Temp\meineTabelle.xls"
    XLExport.Close
    oExcel.Quit
End Sub

Tipps für Profis

  • Verwendung von Option Explicit: Füge am Anfang deines Codes Option Explicit hinzu, um sicherzustellen, dass alle Variablen deklariert werden. Dies hilft, Fehler zu vermeiden.

  • Debugging: Nutze die Debugging-Tools in VBA, um den Code Schritt für Schritt auszuführen und die Werte von Variablen zu überprüfen.

  • Dokumentation: Füge Kommentare zu deinem Code hinzu, um die Funktionsweise zu erklären. Dies kann dir und anderen Entwicklern helfen, den Code besser zu verstehen.


FAQ: Häufige Fragen

1. Was bedeutet Fehler 1004 in Excel VBA?
Der Fehler 1004 tritt auf, wenn eine Methode oder Eigenschaft in Excel VBA nicht erfolgreich ausgeführt werden kann. Häufige Ursachen sind falsche Objektreferenzen oder das Schließen von Excel während der Ausführung.

2. Wie kann ich verhindern, dass Excel beim Schließen nach dem Speichern fragt?
Du kannst die Abfrage unterdrücken, indem du oExcel.DisplayAlerts = False vor dem Schließen der Anwendung verwendest.

3. Warum funktioniert CopyFromRecordset nicht?
Wenn die CopyFromRecordset-Methode nicht funktioniert, kann es daran liegen, dass das Zielobjekt (z.B. Selection) nicht korrekt definiert ist. Stelle sicher, dass du direkt auf das Arbeitsblatt zugreifst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige