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

Leere Ordner finden und Unterverzeichnis

Forumthread: Leere Ordner finden und Unterverzeichnis

Leere Ordner finden und Unterverzeichnis
04.09.2014 20:08:31
sam

Moin,
zu erst ein Mal ich habe die Mac 2011 Version. Das konnte ich leider nicht auswählen.
Jetzt zu meinem Problem. Ich habe mir ein VBA Makro gesucht und es ein bisschen angepasst.
Option Explicit
Option Base 1
Dim folders() As String, files() As String, foldersname() As String, filesname() As String
Dim filecount As Integer, foldercount As Integer
Dim mypath

Sub GetFiles()
Dim myfile
filecount = 0
myfile = Dir("")
Do
If Left(myfile, 1) <> "." Then
filecount = filecount + 1
ReDim Preserve files(filecount)
ReDim Preserve filesname(filecount)
files(filecount) = CurDir() & Application.PathSeparator & myfile
filesname(filecount) = myfile
End If
myfile = Dir()
Loop Until myfile = ""
End Sub

Sub Getfolders()
Dim mydir
mypath = Application.ActiveWorkbook.Path & Application.PathSeparator
foldercount = 0
mydir = Dir("", vbDirectory)
Do
If mydir = "." Or mydir = ".." Then GoTo continue
If GetAttr(mypath & mydir) = vbDirectory Then
foldercount = foldercount + 1
ReDim Preserve folders(foldercount)
ReDim Preserve foldersname(foldercount)
folders(foldercount) = mypath & mydir
foldersname(foldercount) = mydir
End If
continue:
mydir = Dir()
Loop Until mydir = ""
End Sub

Sub DateienUndOrdner()
Dim fcount As Integer
Getfolders
GetFiles
With Worksheets("Liste")
Application.ScreenUpdating = False
'Range leeren
.Range("A:B").ClearContents
'Überschriften setzen
.Range("A1").Value = "Ordner"
.Range("B1").Value = "Dateien"
'Folder listen
If foldercount > 0 Then
For fcount = LBound(folders) To UBound(folders)
.Hyperlinks.Add Anchor:=.Range("A1").Offset(fcount, 0), _
Address:=folders(fcount), _
TextToDisplay:=foldersname(fcount)
Next fcount
End If
'Dateien listen
If filecount > 0 Then
For fcount = LBound(files) To UBound(files)
.Hyperlinks.Add Anchor:=.Range("B1").Offset(fcount, 0), _
Address:=files(fcount), _
TextToDisplay:=filesname(fcount)
Next fcount
.Columns("A:B").EntireColumn.AutoFit
End If
Application.ScreenUpdating = True
End With
End Sub

Dazu habe ich ein paar Fragen und ich würde mich tierisch freuen, wenn die mir jemand beantworten würde. Ich habe schon sehr lange viel gesucht.
Wenn If GetAttr(mypath & mydir) = vbDirectory Then stimmt, warum handelt es sich dann um einen Ordner?
Ich möchte eig. nur Leere Ordner in folders() rein schreiben. Ich hatte überlegt wenn ich ein Ordner gefunden habe, in den Ordner zu wechseln mit ChDir und zu gucken ob dort Datein drin sind. Wenn dort Datein drin sind, wollte ich da weiter nach Ordnern suchen und wenn er leer ist, ihn einfach in folders() rein schreiben. Habe ich aber leider nicht hinbekommen. Ich finde auch keine Funktion die mir die Größe eines Ordners zurück gibt. Also Ich will unterverzeichnisse durchsuchen können und nur Leere Ordner auflisten.
Es wäre noch wichtig, dass das Makro unter windows und apple funktioniert.
lg Sam :)

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Leere Ordner finden und Unterverzeichnis
05.09.2014 18:17:22
Franc
GetAttr(Ordner/Datei) liefert einen Wert zurück.
Bei einem Ordner ist es "16" bzw. "vbDirectory"
Ergo wird das in der if then schleife nur ausgeführt, wenn als Wert vom Pfad ein Ordner erkannt wird. Bei einer Datei liefert er bei mir immer den Wert 32 = vbArchive zurück.
Um zu sehen ob ein Ordner leer ist, kannst folgendes nutzen.
Bei If GetAttr(mypath & mydir) = vbDirectory Then
schreibst
"if Dir(mypath & mydir & "\*.*") = "" then"
das liefert dir alle Dateinamen in dem Verzeichnis und wenn keine drin sind, dann gibt es nichts also "" zurück
Das \ steht vor dem *.*, weil mydir nur den Verzeichnisnamen ohne das \ dahinter enthält.
Bei der Else Anweisung bin ich mir grad nicht ganz sicher aber sollte schon richtig sein.
Der prüft ja ob Array Filename(aktuelle pos) ein Verzeichnis ist und wenn das nicht der Fall ist, dann überschreibt er das nicht leere Verzeichnis mit dem nächsten Wert.
Lass dire Frage aber sicherheitshalber mal offen ^^
If GetAttr(mypath & mydir) = vbDirectory Then
If Dir(mypath & mydir & "\*.*") = "" Then
foldercount = foldercount + 1
ReDim Preserve folders(foldercount)
ReDim Preserve foldersname(foldercount)
folders(foldercount) = mypath & mydir
foldersname(foldercount) = mydir
Else
folders(foldercount) = mypath & mydir
foldersname(foldercount) = mydir
End If
End If

Anzeige
AW: Leere Ordner finden und Unterverzeichnis
05.09.2014 18:23:23
Franc
ich hasse es ^^
der nimmt alle tabs raus damit es "schön" aussieht noch mal das ganze Makro.
Sub Getfolders()
Dim mydir
foldercount = 0
mydir = Dir("", vbDirectory)
mypath = Application.ActiveWorkbook.Path & Application.PathSeparator
Do
If mydir = "." Or mydir = ".." Then GoTo continue
If GetAttr(mypath & mydir) = vbDirectory Then
If Dir(mypath & mydir & "\*.*") = "" Then
foldercount = foldercount + 1
ReDim Preserve folders(foldercount)
ReDim Preserve foldersname(foldercount)
folders(foldercount) = mypath & mydir
foldersname(foldercount) = mydir
Else
folders(foldercount) = mypath & mydir
foldersname(foldercount) = mydir
End If
End If
continue:
mydir = Dir()
Loop Until mydir = ""
End Sub

Anzeige
AW: Leere Ordner finden und Unterverzeichnis
06.09.2014 15:43:46
Hajo_Zi
warum offen, Du hast doch eine Lösung gepostet. Lasse den Fragesteller entscheiden ob offen.

;
Anzeige

Infobox / Tutorial

Leere Ordner finden und Unterverzeichnisse durchsuchen


Schritt-für-Schritt-Anleitung

Um leere Ordner in einem Verzeichnis zu finden und Unterverzeichnisse zu durchsuchen, kannst Du ein VBA-Makro verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Kopiere und füge den folgenden Code in das Modul ein:
Sub Getfolders()
    Dim mydir As String
    Dim foldercount As Integer
    foldercount = 0
    mydir = Dir("", vbDirectory)
    mypath = Application.ActiveWorkbook.Path & Application.PathSeparator
    Do
        If mydir = "." Or mydir = ".." Then GoTo continue
        If GetAttr(mypath & mydir) = vbDirectory Then
            If Dir(mypath & mydir & "\*.*") = "" Then
                foldercount = foldercount + 1
                ReDim Preserve folders(foldercount)
                ReDim Preserve foldersname(foldercount)
                folders(foldercount) = mypath & mydir
                foldersname(foldercount) = mydir
            End If
        End If
continue:
        mydir = Dir()
    Loop Until mydir = ""
End Sub
  1. Führe das Makro aus, um die leeren Ordner in Deinem aktuellen Verzeichnis zu finden.

Häufige Fehler und Lösungen

  • Fehler: "Subscript out of range"

    • Lösung: Stelle sicher, dass Du die Variablen folders und foldersname korrekt deklariert hast und dass sie als Array initialisiert werden.
  • Problem: Das Makro findet keine leeren Ordner.

    • Lösung: Überprüfe, ob Du den richtigen Pfad in mypath angegeben hast. Es ist wichtig, dass der Pfad korrekt ist, damit das Makro funktioniert.
  • Fehler: Das Makro läuft nicht auf dem Mac.

    • Lösung: Teste den Code unter einer Windows-Umgebung, da einige Funktionen in der Mac-Version von Excel nicht identisch sind.

Alternative Methoden

Wenn Du keine VBA-Makros verwenden möchtest, kannst Du auch die Windows-Suchfunktion nutzen, um leere Ordner zu finden:

  1. Öffne den Windows Explorer.
  2. Navigiere zu dem Verzeichnis, in dem Du leere Ordner suchen möchtest.
  3. Gib in die Suchleiste size:0 ein. Dies zeigt alle leeren Ordner an.

Ein weiteres Tool, das Du verwenden kannst, ist "CCleaner", welches eine Funktion zum Suchen und Entfernen von leeren Verzeichnissen bietet.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du das VBA-Makro verwenden kannst:

  • Um alle leeren Ordner im Verzeichnis "C:\Users\DeinName\Documents" zu finden, ändere die Zeile mypath = Application.ActiveWorkbook.Path & Application.PathSeparator zu mypath = "C:\Users\DeinName\Documents\".

  • Möchtest Du die leeren Ordner in Unterverzeichnissen finden, kannst Du die Funktion Getfolders in einer Rekursion anpassen, um auch die Unterverzeichnisse zu durchlaufen.


Tipps für Profis

  • Erweiterung des Codes: Du kannst den Code anpassen, um auch andere Dateitypen zu finden oder nur bestimmte Ordner auszuschließen.
  • Leistungsoptimierung: Verwende Application.Calculation = xlCalculationManual am Anfang des Makros, um die Berechnung zu deaktivieren und die Ausführung zu beschleunigen.
  • Debugging: Nutze Debug.Print innerhalb Deines Codes, um die gefundenen Ordner in das Direktfenster von VBA zu drucken. Dies hilft Dir, die Ergebnisse besser nachzuvollziehen.

FAQ: Häufige Fragen

1. Wie kann ich das Makro auf einem Mac ausführen? Die oben genannten VBA-Methoden sind hauptsächlich für Windows geeignet. Du kannst versuchen, das Makro auf einem Windows-Rechner auszuführen oder alternative Softwarelösungen zu verwenden.

2. Was kann ich tun, wenn mein Makro nicht funktioniert? Überprüfe den Code auf Syntaxfehler und stelle sicher, dass alle Variablen korrekt deklariert sind. Suche auch nach spezifischen Fehlermeldungen, die Dir helfen könnten, das Problem zu identifizieren.

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