Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Alle Excel-Dateien in einem Verzeichnis öffnen

Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 17:26:48
Niclas
Hallo zusammen,
folgende Problemstellung:
Ich will mittels der INDIREKT-Funktion Daten aus anderen Excel-Dateien zusammentragen. Dies funktioniert ja bekanntermaßen nur, wenn diese Dateien auch geöffnet sind.
Daher versuche ich momentan ein Makro zu bauen, das alle Excel-Dateien in einem bestimmten Verzeichnis (sowie auch die Dateien in allen Unterordnern!) öffnet.
Die Dateien im Zielpfad zu öffnen funktioniert auch bereits, nur weiß ich leider nicht, wie ich die Unterordner mit einbeziehen kann.
Der Code sieht momentan so aus:
Sub GetData()
Dim pfad As String, Dateiname As String, iRow As Long
Application.ScreenUpdating = False
pfad = "C:\Users\xxx\Desktop\01_07\"
Dateiname = Dir(pfad & "*.xlsx")
Do While Dateiname  ""
Workbooks.Open Filename:=pfad & Dateiname
Dateiname = Dir()
Loop
End Sub

Über einen Tipp wäre ich sehr dankbar!
MfG
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 17:50:37
Sepp
Hallo Niclas,
du solltest zuerst mal beschreiben, welche Daten aus welchen Tabellenblättern du benötigst, vielleicht gibt es ja andere Wege als mit INDIREKT().
Gruß Sepp

Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 17:51:04
Piet
Hallo Niclas,
im Prinzip hast du die Lösung selbst angeboten, kommst nur nicht darauf! Dabei ist es sehr simpel...
Kopiere das Makro von Pfad bis Loop und füge es unter Loop neu ein! Dann gibst du im 2.Pfad den Unterordner mit an! usw. usw.
mfg Piet
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 17:55:23
Niclas
Hallo,
vielen Dank für die Rückmeldungen.
Also konkret will ich aus verschiedenen Excel-Tabellen immer die gleichen Felder auslesen und diese dann in einer Übersicht zusammenführen. Ich habe in der Zieldatei auch schon alles vorformatiert, das einzige, was noch fehlt, ist das Öffnen der Quelldateien.
@Piet
Das ist mir schon klar, nur sind es sehr viele Unterordner und für jeden einzelnen Ordner eine Pfadänderung im Code abzubilden wäre viel zu aufwändig. Vorteil der Sache mit den Unterordnern ist ja, dass der Code dadurch universell einsetzbar wird.
MfG
Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 17:57:42
Sepp
Hallo Niclas,
"Also konkret will ich aus verschiedenen Excel-Tabellen immer die gleichen Felder auslesen und diese dann in einer Übersicht zusammenführen"
Konkret! Welche Zellen aus welchen Tabellen und wohin?
Eventuell wäre eine Beispieldatei hilfreich.
Gruß Sepp

Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 18:05:40
Niclas
Hallo,
eine Beispieldatei kann ich leider nicht liefern, da ich die Dateien momentan nicht bei mir habe.
Das System sieht so aus:
Aus der Zieldatei wird über die INDIREKT-Funktion nach Ordnern im System gesucht, einer für jeden Tag des Jahres (01_01, 01_02 usw.). Es kann sein, dass es diesen Ordner gibt, oder eben nicht. Wenn der Ordner nicht existiert und es einen Bezugsfehler gibt, ist in Excel hinterlegt, dass einfach nichts ausgegeben wird. Wenn der Bezug gefunden wird, dann liegt in diesem Ordner immer eine Exceldatei (mit nur einem Arbeitsblatt), aus der z.B. die Felder A15, D16, D17 und D18 ausgelesen und in die Zieldatei übertragen werden sollen.
In der Zieldatei habe ich die Links in die Ordnerstruktur dynamisch generiert und daraus die Funktion für die Abfrage zusammengebaut (im Zielpfad ändert sich ja jedes Mal das Datum). Über die Namensfunktion wird die (in Textform vorliegende) Funktion dann schließlich berechnet.
MfG
Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 18:10:58
Sepp
Hallo Niclas,
und wozu INDIREKT() und wozu die Dateien öffnen?
Wenn der Bezug als Text vorliegt, kann man ja einfach prüfen, ob die Datei existiert und wenn ja, dann kann man aus dem Text-Bezug per VBA eine Formel erstellen die auch bei geschlossener Datei funktioniert, oder die Werte auf andere Art aus der Datei ziehen.
Ohne genauere Infos kann ich nicht mehr sagen.
Gruß Sepp

Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 18:39:29
Niclas
Hallo,
wie würdest du denn prüfen, ob die Datei existiert? Da der Pfad dynamisch ist, müsste man entweder für jede Möglichkeit den VBA-Code anpassen (und somit duplizieren) oder eine VBA-Funktion basteln, die die Pfadänderung mit abbilden kann. Das übersteigt aber leider meine VBA-Kenntnisse..
Was für weitere Infos benötigst du denn, um festzustellen, inwiefern man das Ganze direkt komplett über VBA lösen könnte?
1. Schritt: Prüfen, ob Datei/Ordner vorhanden ist (dynamischer Pfad je nach Datum) z.B. C:\Users\xxx\Desktop\01_01\[xxx.xlsx]
2. Schritt: Wenn nein, nächstes Datum prüfen, wenn ja Excel-Datei in diesem Ordner öffnen, Felder A15, D16, D17 und D18 auslesen und in E1, F1, G1, H1 in der Zieldatei einfügen, nächstes Datum prüfen
3. Funktionsende bei letztem Datum des Jahres 12_31
MfG
Anzeige
AW: Alle Excel-Dateien in einem Verzeichnis öffnen
26.08.2017 19:28:44
Sepp
Hallo Niclas,
eine Möglichkeit.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub getData()
Dim strPath As String, strFile As String, strTab As String, strFormula As String
Dim varRanges As Variant
Dim lngDate As Long, lngEnd As Long, lngI As Long, lngR As Long

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .AskToUpdateLinks = False
  .DisplayAlerts = False
  .Calculation = xlCalculationManual
End With

varRanges = Array("A15", "D16", "D17", "D18")

lngEnd = IIf(Month(DateSerial(Year(Date), 2, 29)) = 3, 365, 366)

strPath = "E:\Forum\" 'Stammverzeichnis

strTab = "Tabelle1" 'Tabellenname

With ThisWorkbook.Sheets("Tabelle2") 'Name der Ausgabetabelle
  For lngDate = 1 To lngEnd
    strFile = Dir(strPath & Format(DateSerial(Year(Date), 1, lngDate), "DD_MM") & "\*.xlsx", vbNormal)
    If strFile <> "" Then
      lngR = lngR + 1
      strFormula = "='" & strPath & "[" & strFile & "]" & strTab & "'!"
      For lngI = 0 To UBound(varRanges)
        .Cells(lngR, 5 + lngI).Formula = strFormula & varRanges(lngI)
      Next
    End If
  Next
  .Range("E1").Resize(lngR, 4) = .Range("E1").Resize(lngR, 4).Value
End With




ErrorHandler:

If Err.Number <> 0 Then
  MsgBox "Fehler in Modul2" & vbLf & vbLf & "Prozedur:" & vbTab & "getData" & vbLf & _
    "Nummer:" & vbTab & Err.Number & vbLf & "Meldung:" & vbTab & Err.Description & vbLf & _
    IIf(Erl, "Zeile:" & vbTab & Erl, ""), vbExclamation, "Fehler!"
  Err.Clear
End If

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .AskToUpdateLinks = True
  .DisplayAlerts = True
  .Calculation = xlCalculationAutomatic
End With

End Sub

Wahrscheinlich sollt der Dateiname oder Pfad auch noch irgendwo hin, aber du kannst dich ja nochmals melden.
Gruß Sepp

Anzeige
Fehler im Code!
26.08.2017 20:12:34
Sepp
Hallo Niclas,
da hatte sich ein fehler eingeschlichen.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub getData()
Dim strPath As String, strFile As String, strTab As String, strFormula As String
Dim varRanges As Variant
Dim lngDate As Long, lngEnd As Long, lngI As Long, lngR As Long

On Error GoTo ErrorHandler

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .AskToUpdateLinks = False
  .DisplayAlerts = False
  .Calculation = xlCalculationManual
End With

varRanges = Array("A15", "D16", "D17", "D18")

lngEnd = IIf(Month(DateSerial(Year(Date), 2, 29)) = 3, 365, 366)

strPath = "E:\Forum\" 'Stammverzeichnis

strTab = "Tabelle1" 'Tabellenname

With ThisWorkbook.Sheets("Tabelle2") 'Name der Ausgabetabelle
  For lngDate = 1 To lngEnd
    strFile = Dir(strPath & Format(DateSerial(Year(Date), 1, lngDate), "DD_MM") & "\*.xlsx", vbNormal)
    If strFile <> "" Then
      lngR = lngR + 1
      strFormula = "='" & strPath & Format(DateSerial(Year(Date), 1, lngDate), "DD_MM") & "\[" & strFile & "]" & strTab & "'!"
      For lngI = 0 To UBound(varRanges)
        .Cells(lngR, 5 + lngI).Formula = strFormula & varRanges(lngI)
      Next
    End If
  Next
  .Range("E1").Resize(lngR, 4) = .Range("E1").Resize(lngR, 4).Value
End With

ErrorHandler:

If Err.Number <> 0 Then
  MsgBox "Fehler in Modul2" & vbLf & vbLf & "Prozedur:" & vbTab & "getData" & vbLf & _
    "Nummer:" & vbTab & Err.Number & vbLf & "Meldung:" & vbTab & Err.Description & vbLf & _
    IIf(Erl, "Zeile:" & vbTab & Erl, ""), vbExclamation, "Fehler!"
  Err.Clear
End If

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .AskToUpdateLinks = True
  .DisplayAlerts = True
  .Calculation = xlCalculationAutomatic
End With

End Sub

Gruß Sepp

Anzeige
AW: Fehler im Code!
26.08.2017 21:37:32
Niclas
Hallo,
vielen Dank für deine Mühe, diesen umfangreichen Code zu schreiben!
Es passt alles wunderbar, nur bei strFile und strFormula, die den Pfad generiert, habe ich "DD" und "MM" vertauscht, sodass erst Monat und dann Tag in den Pfad geschrieben wird.
Wirklich eine Top-Lösung, vielen Dank nochmals für deine Hilfe!!
MfG
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Alle Excel-Dateien in einem Verzeichnis öffnen


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeineDatei)" -> Einfügen -> Modul.

  3. Kopiere und füge den folgenden Code ein:

    Sub GetData()
       Dim strPath As String, strFile As String, strTab As String
       Dim varRanges As Variant
       Dim lngDate As Long, lngEnd As Long, lngR As Long, lngI As Long
    
       Application.ScreenUpdating = False
       Application.EnableEvents = False
       Application.DisplayAlerts = False
       Application.Calculation = xlCalculationManual
    
       varRanges = Array("A15", "D16", "D17", "D18")
       lngEnd = IIf(Month(DateSerial(Year(Date), 2, 29)) = 3, 365, 366)
       strPath = "C:\Users\xxx\Desktop\01_07\" ' Ändere dies zu deinem Verzeichnis
       strTab = "Tabelle1" ' Ändere dies entsprechend deinem Tabellennamen
    
       For lngDate = 1 To lngEnd
           strFile = Dir(strPath & Format(DateSerial(Year(Date), 1, lngDate), "DD_MM") & "\*.xlsx")
           If strFile <> "" Then
               lngR = lngR + 1
               For lngI = 0 To UBound(varRanges)
                   ThisWorkbook.Sheets("Tabelle2").Cells(lngR, 5 + lngI).Formula = "='" & strPath & "[" & strFile & "]" & strTab & "'!" & varRanges(lngI)
               Next lngI
           End If
       Next lngDate
    
       Application.ScreenUpdating = True
       Application.EnableEvents = True
       Application.DisplayAlerts = True
       Application.Calculation = xlCalculationAutomatic
    End Sub
  4. Führe das Makro aus: Klicke auf F5 oder wähle das Makro aus der Liste aus und klicke auf "Ausführen".


Häufige Fehler und Lösungen

  • Fehler beim Öffnen von Dateien: Stelle sicher, dass der Pfad zu den Excel-Dateien korrekt ist. Die .xls-Dateien sollten im angegebenen Verzeichnis vorhanden sein.
  • Datei nicht gefunden: Wenn du eine ._xls-datei anzeigen möchtest, überprüfe, ob die Dateiendung korrekt angegeben ist.
  • Anwendungsfehler: Dieser Fehler kann auftreten, wenn der Code auf eine nicht existierende Tabelle verweist. Überprüfe die Namen deiner Tabellen.

Alternative Methoden

  • Verwendung von FileSystemObject: Du kannst auch die FileSystemObject-Bibliothek nutzen, um alle Excel-Dateien in einem Verzeichnis zu durchlaufen und zu öffnen. Diese Methode kann effizienter sein, wenn du mit vielen Unterordnern arbeitest.

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim folder As Object
    Set folder = fso.GetFolder("C:\Users\xxx\Desktop\01_07\")
    Dim file As Object
    
    For Each file In folder.Files
      If Right(file.Name, 5) = ".xlsx" Then
          Workbooks.Open file.Path
      End If
    Next file

Praktische Beispiele

Um alle excel dateien anzuzeigen, die in einem Verzeichnis gespeichert sind, kannst du den oben genannten Code verwenden.

Ein Beispiel für den dynamischen Pfad könnte so aussehen:

strPath = "C:\Users\xxx\Desktop\" & Format(Date, "MM_DD") & "\"

Dies ermöglicht es dir, .xlsx-dateien zu lesen, die nach dem Datum benannt sind.


Tipps für Profis

  • Verwende Error Handling: Um mögliche Fehler abzufangen, füge Error Handling in deinen Code ein. Dies hilft dir, Probleme schneller zu identifizieren.

    On Error Resume Next
    ' Dein Code hier
    If Err.Number <> 0 Then
      MsgBox "Fehler aufgetreten: " & Err.Description
    End If
  • Daten in Arrays speichern: Wenn du viele Daten verarbeiten musst, kann die Verwendung von Arrays die Geschwindigkeit deines Makros verbessern.


FAQ: Häufige Fragen

1. Wie kann ich .xls-dateien anzeigen? Um .xls-dateien anzuzeigen, musst du sicherstellen, dass sie im gleichen Verzeichnis wie deine .xlsx-dateien gespeichert sind. Der Code kann entsprechend angepasst werden.

2. Was ist eine ._xlsx-datei? Eine ._xlsx-datei ist eine temporäre Datei, die von einigen Systemen erstellt wird. Sie kann möglicherweise nicht direkt geöffnet werden, wenn die Hauptdatei bereits geöffnet ist.

3. Wie kann ich alle Excel-Dateien in einem Ordner durchlaufen? Verwende die Dir-Funktion, um alle Dateien mit der Endung .xlsx abzurufen, und öffne sie in einer Schleife, wie im oben beschriebenen Code dargestellt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige