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

Forumthread: Laufzeitfehler 9

Laufzeitfehler 9
16.08.2018 08:58:05
Martin
Hallo,
ich verzweifle langsam. Bin relativer VBA Neuling und versuche verschiedene Makros aus VBA Büchern nachzustellen. Ich nutze Excel 2010.
Folgende Wunschkonstellation:
Ich habe 2 Excel Dateien, DateiA.xlsx mit Tabellenblatt "Quelle" und DateiB.xlsm mit Tabellenblatt "Ziel".
In der Tabelle "Quelle" steht in Feld A1 einfach nur "abc".
Diesen Text möchte ich mit folgendem Befehl aus DateiA.xlsx Tabellenblatt "Quelle" A1 nach DateiB.xlsm Tabellenblatt "Ziel" nach A1 kopieren.
Workbooks("D:\VBA\DateiA.xlsx").Sheets("Quelle").Range(Cells(1, 1), Cells(1, 1)).Value.Copy _
Workbooks("D:\VBA\DateiB.xlsm").Sheets("Ziel").Range(Cells(1, 1), Cells(1, 1))
Ich würde hier gerne mit Cells arbeiten, um das ganz über Variablen nachher etwas variabler gestalten zu können. Ich habe aber auch mal folgendes probiert mit gleicher Meldung.
Workbooks("D:\VBA\DateiA.xlsx").Sheets("Quelle").Range("A1").Value.Copy _
Workbooks("D:\VBA\DateiB.xlsm").Sheets("Ziel").Range("A1")
Der Aufruf des VBA Codes findet aus der geöffneten DateiB.xlsm statt.
Muss DataA.xlsx erst geöffnet werden, damit der Copy Befehl funktioniert? Das steht im Buch so nämlich nicht drin.
Um es innerhalb einer Arbeitsmappe mal grundsätzlich auszuprobieren, ohne das Problem _
mit der ungeöffneten 2. Excel Datei zu haben, habe ich in der Datei DateiB.xlsm mal das _ Tabellenblatt "Tabelle1" angelegt und dort in A1 "abc" eingetragen. Mit folgendem simplen Code wollte ich ausprobieren, ob ich den Inhalt von A1 mit debug.print ausgeben kann. Auch da kommt leider der Laufzeit 9 Fehler... Ich kapiers einfach nicht...

Sub Verarbeitung()
Dim a As String
a = Workbooks("D:\VBA\DateiB.xlsm").Sheets("Tabelle1").Cells(1, 1).Value
Debug.Print a
End Sub

Hoffe mir kann jemand weiterhelfen.
Die Sache mit den 2 Dateien und den Cells Angaben in der Range wäre das Optimum, aber ich würde es gerne überhaupt erst mal ans Laufen kriegen...
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 9
16.08.2018 09:02:22
Werner
Hallo Martin,
das hier ist quatsch.
Workbooks("D:\VBA\DateiA.xlsx").Sheets("Quelle").Range(Cells(1, 1), Cells(1, 1)).Value.Copy _
Warum denn eine Range, wenn du nur eine Zelle kopieren willst:
Workbooks("D:\VBA\DateiA.xlsx").Sheets("Quelle").Cells(1, 1)).Copy _
Und ja, die Datei muss geöffnet sein. Mit VBA kannst du nur auf geöffnete Dateien zugreifen. Du mußt die Datei mittels VBA-Code öffnen, deine Zelle kopieren und die Datei anschließend wieder schließen.
Gruß Werner
Anzeige
AW: Laufzeitfehler 9
16.08.2018 09:28:28
Martin
Hallo Werner,
deshalb mit Range, weil ich erstmal nur zu Testzwecken nur mit 1 Zelle Arbeite. Das eigentliche Makro soll sich nachher auf mehrere Zellen beziehen.
Das aber selbst dieses einfache Makro innerhalb einer Datei nicht funktioniert und der Laufzeitfehler 9 kommt kapier ich nicht
Sub Verarbeitung()
Dim a As String
a = Workbooks("D:\VBA\DateiB.xlsm").Sheets("Tabelle1").Cells(1, 1).Value
Debug.Print a
End Sub

Anzeige
AW: Laufzeitfehler 9
16.08.2018 09:32:48
Roland
Hallo Martin,
also ich bekomme keinen Fehler, wenn ich das Makro starte...
Sub Verarbeitung()
Dim a As String
a = ThisWorkbook.Sheets("Tabelle1").Cells(1, 1).Value
Debug.Print a
End Sub

AW: Laufzeitfehler 9
16.08.2018 10:19:46
Martin
Hallo Roland,
ich hatte in einem anderen Beitrag schon gelesen, dass auf manchen Rechner mit demselben Code der Laufzeitfehler 9 kommt und auf anderen nicht...
Anzeige
AW: Laufzeitfehler 9
16.08.2018 09:36:45
Hajo_Zi
Hallo Werner,
Du kannst aus einer geschlossenen Datei nur kompliziert was auslesen, benutze Formel.
Option Explicit
Public Function GetDataClosedWB(SourcePath As String, _
SourceFile As String, sourceSheet As String, _
SourceRange As String, TargetRange As Range) As Boolean
'Holt einen Bereich aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus
'? t.ramel@mvps.org
' wird durch die HoleDaten aufgerufen
Dim strQuelle       As String
Dim Zeilen          As Long
Dim Spalten         As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range( _
SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Value = .Value
End With
GetDataClosedWB = True
Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ung?ltig!", vbExclamation, "Get data from  _
closed Workbook"
GetDataClosedWB = False
End Function
Public Sub HoleDaten()
' Die Funktion arbeitet mit der obrigen GetDataClosedWB zusammen
Dim Pfad            As String
Dim Dateiname       As String
Dim Blatt           As String
Dim Bereich         As String
Dim Ziel            As Range
Pfad = "L:\Eigene Dateien\Hajo\Internet\Test\2009\"
Dateiname = "Beispiel Forum 30.xlsm" ' aus welcher Datei soll er holen?
Blatt = "Tabelle1"  ' von welcher Tabelle soll er holen?
Bereich = "A1:B9"   ' aus welchem Bereich soll er holen?
Set Ziel = ActiveSheet.Range("A1")  ' in welchen Bereich soll er kopieren? Genauer gesagt:  _
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Anzeige
AW: Laufzeitfehler 9
16.08.2018 09:31:10
Daniel
Hi
Wie schon gesagt, wenn du mit VBA Dateien bearbeiten willst, müssen diese geöffnet sein.
Dann reicht es aber, bei Workbooks nur den Dateinamen abzugeben.
Workbooks("DateiA.xlsx").Sheets("Quelle").Range("A1").Value.Copy _
Workbooks("DateiB.xlsm").Sheets("Ziel").Range("A1")

Gruß Daniel
Anzeige
AW: Laufzeitfehler 9
16.08.2018 10:35:58
Martin
Klappt aber leider auch nicht wenn beide Dateien geöffnet sind...
Ist der Copy Befehl formal so denn korrekt? Wenn Ja, dann kapier ich den Fehler 9 nicht...
AW: Laufzeitfehler 9
16.08.2018 10:45:28
Daniel
Hi
Schau dir mal die Kopfzeile des Excelfensters an.
Oder gib mal folgendes im Direktfenster ein: ?Worksheets(1).name
Steht dort der Dateiname mit oder ohne Dateierweiterung?
Entsprechend musst du es auch in deinen Code anwenden.
Das hängt an einer Einstellung in deinem Explorer, ob Dateinamen mit oder ohne Erweiterung angezeigt werden.
Der Copy-Befehl ist korrekt.
Laufzeitfehler 9 weist darauf hin, dass du einen Datei- oder Worksheetnamen falsch geschrieben hast.
Gruß Daniel
Anzeige
AW: Laufzeitfehler 9
16.08.2018 11:03:33
Martin
Hallo Daniel,
Das sind die Ergebnisse aus dem Direktfenster.
?Worksheets(1).name
Tabelle1
?Workbooks(1).name
DateiA.xlsm
Also alles korrekt. Hab auch schon zig mal geguckt ob ich mich verschrieben habe, hab ich aber nicht, wie man an dem Ergebnis aus dem Direktfenster sehen kann. Echt kacke
Anzeige
AW: Laufzeitfehler 9
16.08.2018 11:16:08
Daniel
Was noch falsch ist, ist das Cells(..).Value.Copy
Richtig wäre nur Cells(...).Copy
Man kopiert in Excel die ganze Zelle, nicht nur ihren Wert
Gruß Daniel
AW: Laufzeitfehler 9
16.08.2018 11:42:12
Martin
Danke dir.
Aber auch dann kommt der Fehler.
Bei mir tut es ja leider nicht mal dieser simple Code...
Da krieg ich ja schon den 9er Fehler...
Sub Verarbeitung()
Dim a As String
a = Workbooks("D:\VBA\Thomas\Neu\irgendwie.xlsm").Sheets("Tabelle1").Cells(1, 1).Value
Debug.Print a
End Sub

Anzeige
AW: Laufzeitfehler 9
17.08.2018 09:17:23
Daniel
Hatten wir dir nicht schon erklärt, dass die Datei irgendwie.xlsm geöffnet sein muss und dass man bei Workbooks nur den Dateinamen hin schreibt, ohne den Pfad davor?
Sub Verarbeitung()
Dim a As String
Workbooks.Open "D:\VBA\Thomas\Neu\irgendwie.xlsm"
a = Workbooks("irgendwie.xlsm").Sheets("Tabelle1").Cells(1, 1).Value
Workbooks("irgendwie.xlsm").close
Debug.Print a
End Sub
Gruß Daniel
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Laufzeitfehler 9 in Excel VBA beheben


Schritt-für-Schritt-Anleitung

  1. Dateien öffnen: Stelle sicher, dass alle Excel-Dateien, die du mit VBA ansprechen möchtest, geöffnet sind. Du kannst dies manuell tun oder mit VBA den Befehl Workbooks.Open nutzen.

    Workbooks.Open "D:\VBA\DateiA.xlsx"
    Workbooks.Open "D:\VBA\DateiB.xlsm"
  2. Korrekte Verwendung der Zellen: Wenn du nur eine Zelle kopieren möchtest, verwende den Copy-Befehl direkt auf der Zelle, nicht auf einem Bereich. Zum Beispiel:

    Workbooks("DateiA.xlsx").Sheets("Quelle").Cells(1, 1).Copy _
    Workbooks("DateiB.xlsm").Sheets("Ziel").Cells(1, 1)
  3. Debugging: Wenn du einen laufzeitfehler 9 erhältst, überprüfe die Namen der Arbeitsmappen und Arbeitsblätter genau. Verwende das Direktfenster in VBA, um die Namen zu überprüfen:

    ?Workbooks(1).Name
    ?Worksheets(1).Name

Häufige Fehler und Lösungen

  • Datei nicht geöffnet: Wenn du versuchst, auf eine Datei zuzugreifen, ohne dass sie geöffnet ist, erhältst du den laufzeitfehler 9. Stelle sicher, dass die Datei geöffnet ist oder öffne sie programmgesteuert.

  • Falscher Name oder Pfad: Ein häufiger Grund für den vba laufzeitfehler 9 ist ein Tippfehler im Namen der Arbeitsmappe oder des Arbeitsblatts. Achte darauf, dass du die Dateinamen ohne den vollständigen Pfad angibst, wenn die Datei bereits geöffnet ist.

  • Verwendung von Cells: Achte darauf, dass du beim Kopieren von Werten nicht .Value.Copy verwendest. Der korrekte Befehl ist einfach .Copy.


Alternative Methoden

Falls du auf Daten aus einer geschlossenen Arbeitsmappe zugreifen möchtest, kannst du die folgende Methode verwenden:

Option Explicit
Public Function GetDataClosedWB(SourcePath As String, SourceFile As String, sourceSheet As String, SourceRange As String, TargetRange As Range) As Boolean
    ' Holt einen Bereich aus einer geschlossenen Arbeitsmappe
    ...
End Function

Diese Funktion ermöglicht es dir, Daten aus einer geschlossenen Datei zu holen, ohne dass diese geöffnet sein muss.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um Daten von einer geöffneten Arbeitsmappe in eine andere zu kopieren:

Sub DatenKopieren()
    Workbooks.Open "D:\VBA\DateiA.xlsx"
    Workbooks("DateiA.xlsx").Sheets("Quelle").Cells(1, 1).Copy _
    Workbooks("DateiB.xlsm").Sheets("Ziel").Cells(1, 1)
    Workbooks("DateiA.xlsx").Close
End Sub

Dieses Makro öffnet die Datei DateiA.xlsx, kopiert den Inhalt von Zelle A1 und schließt die Datei danach.


Tipps für Profis

  • Verwende ThisWorkbook: Wenn du innerhalb des aktuellen Workbooks arbeitest, nutze ThisWorkbook anstelle von Workbooks("DeinWorkbook.xlsm"). Das macht deinen Code robuster.

  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen, um Laufzeitfehler besser zu handhaben. Zum Beispiel:

    On Error Resume Next
    ' Dein Code hier
    If Err.Number <> 0 Then
       MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
    End If
    On Error GoTo 0

FAQ: Häufige Fragen

1. Was bedeutet Laufzeitfehler 9? Der Laufzeitfehler 9 tritt auf, wenn auf eine nicht vorhandene Datei oder ein nicht vorhandenes Arbeitsblatt zugegriffen wird.

2. Muss ich die Arbeitsmappe öffnen, um darauf zuzugreifen? Ja, du musst die Arbeitsmappe öffnen, um mit VBA auf deren Inhalte zugreifen zu können.

3. Wie kann ich Daten aus einer geschlossenen Datei lesen? Du kannst eine benutzerdefinierte Funktion erstellen, die Daten aus einer geschlossenen Arbeitsmappe über Formeln abruft. Dies erfordert jedoch etwas mehr Programmieraufwand.

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