VBA: Ordner und Unterordner durchsuchen
Schritt-für-Schritt-Anleitung
- Öffne Excel und starte den VBA-Editor (ALT + F11).
- Füge ein neues Modul hinzu: Rechtsklick im Projektfenster auf "VBAProject (DeineDatei.xlsx)" > Einfügen > Modul.
- Kopiere den folgenden Code in das Modul:
Option Explicit
Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32.dll" ( _
ByRef psa() As Any) As Long
Public Sub Daten_aus_Protokollen_kopieren()
Const iStartZeile = 4 'Angeben, ab welcher Zeile eingefügt werden soll
Const iStartSpalte = 1 'Angeben, ab welcher Spalte eingefügt werden soll
Const Zellen = "D3,K3,K7,H34,R3,D5,K5,R5,A29" 'Angeben, welche Zellen kopiert werden sollen
Dim oWkb1 As Workbook, oWks1 As Worksheet, oWks0 As Worksheet
Dim objFileDialog As FileDialog
Dim aCells As Variant, iNextLine As Long, i As Long
Dim StatusCalc As XlCalculation
Dim avntFolders() As Variant, sXlsPath As String
Dim strFile As String
Dim ialngFolders As Long
sXlsPath = ThisWorkbook.Path & "\" 'Datei im gleichen Ordner wie Auswertungsdateien
Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
With objFileDialog
.InitialFileName = sXlsPath
.InitialView = msoFileDialogViewSmallIcons
.Title = "Ordner auswählen"
If .Show Then
avntFolders = GetFolders(.SelectedItems(1) & "\") 'Unterordner und seine Unterordner
Call QuickSort(LBound(avntFolders), UBound(avntFolders), avntFolders)
Else
Exit Sub
End If
End With
'Makrobremsen lösen - Am Beginn eines Makros
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation 'Aktuellen Berechnungsmodus merken
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
'Vorgegebenen Tabelleninhalt vor dem Kopieren der Daten löschen
Range("A4:I1000").ClearContents
Set oWks0 = ActiveSheet
aCells = Split(Zellen, ",")
iNextLine = iStartZeile
For ialngFolders = LBound(avntFolders) To UBound(avntFolders)
strFile = Dir$(avntFolders(ialngFolders) & "*.xlsx")
Do Until strFile = vbNullString
Set oWkb1 = Workbooks.Open(avntFolders(ialngFolders) & strFile)
Set oWks1 = oWkb1.Sheets(1)
For i = 0 To UBound(aCells)
oWks0.Cells(iNextLine, iStartSpalte).Offset(0, i).Value = oWks1.Range(aCells(i)).Value
Next
Call oWkb1.Close(SaveChanges:=False)
iNextLine = iNextLine + 1
strFile = Dir$
Loop
Next
'Makrobremsen zurücksetzen - vor dem Beenden eines Makros
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
End Sub
Private Function GetFolders(ByVal pvstrPath As String) As Variant()
Dim avntFolders() As Variant
Dim strFolder As String, strPath As String
Dim ialngIndex1 As Long, ialngIndex2 As Long
strPath = pvstrPath
Do
strFolder = Dir$(strPath & "*", vbDirectory)
Do Until strFolder = vbNullString
If strFolder <> "." And strFolder <> ".." Then
If GetAttr(strPath & strFolder) And vbDirectory Then
ReDim Preserve avntFolders(0 To ialngIndex1)
avntFolders(ialngIndex1) = strPath & strFolder & "\"
ialngIndex1 = ialngIndex1 + 1
End If
End If
strFolder = Dir$
Loop
If ialngIndex1 = ialngIndex2 Then Exit Do
strPath = avntFolders(ialngIndex2)
ialngIndex2 = ialngIndex2 + 1
Loop
GetFolders = avntFolders
End Function
- Schließe den VBA-Editor und gehe zurück zu Excel.
- Starte das Makro über den Menüpunkt "Entwicklertools" > "Makros" und wähle
Daten_aus_Protokollen_kopieren.
Häufige Fehler und Lösungen
Alternative Methoden
Eine alternative Methode zur Abfrage von Ordnern und Unterordnern ist die Nutzung der FileDialog-Klasse in VBA, um dem Benutzer die Auswahl mehrerer Ordner zu ermöglichen. Dies kann jedoch nicht direkt in VBA realisiert werden, da Excel keine native Unterstützung für die Auswahl mehrerer Ordner bietet.
Praktische Beispiele
Hier ist ein einfaches Beispiel, das zeigt, wie Du den GetFolders-Befehl verwenden kannst, um alle Unterordner eines bestimmten Pfades abzurufen:
Dim folders() As Variant
folders = GetFolders("C:\Dein\Verzeichnis\")
Du kannst dann eine Schleife verwenden, um alle gefundenen Ordner zu verarbeiten.
Tipps für Profis
- Verwende die
ofso.getfolder-Methode, um den Pfad zu einem spezifischen Ordner zu erhalten. Diese Methode ist besonders nützlich, wenn Du nur einen bestimmten Ordner abfragen möchtest.
- Nutze
vba strpath, um den aktuellen Pfad dynamisch zu setzen, sodass Dein Makro flexibler wird und nicht an einen statischen Pfad gebunden ist.
FAQ: Häufige Fragen
1. Wie kann ich spezifische Unterordner abfragen?
Du kannst die Funktion GetFolders anpassen, um nur bestimmte Unterordner zu durchsuchen, indem Du eine Bedingung hinzufügst, die prüft, ob der Name des Unterordners in einer vordefinierten Liste enthalten ist.
2. Was bewirkt die Zeile Private Declare PtrSafe Function SafeArrayGetDim?
Diese Zeile ist notwendig, um sicherzustellen, dass Dein Code auch in 64-Bit-Versionen von Excel funktioniert. Sie prüft die Dimensionen eines Arrays, um sicherzustellen, dass Du nicht auf nicht initialisierte Arrays zugreifst.
3. Kann ich auch Dateien in den Hauptordner einbeziehen?
Ja, Du kannst die Zeile, die für das Einfügen des Hauptordners in das Array zuständig ist, auskommentieren, um den Hauptordner in die Abfrage einzubeziehen.