Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1568to1572
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dateien auflisten nach Suche per Teilpfad

Dateien auflisten nach Suche per Teilpfad
25.07.2017 07:59:58
Peter
Guten Morgen ihr Excelspezialisten,
habe folgende Frage.
Auf dem PC befinden sich mehrere Laufwerke.
In einem dieser Laufwerke befindet sich eine Auflistung von Dateien. Diese Dateien
sollen in einer Tabelle aufgelistet werden.
Mittels dem Namen des Teilpfadnamens sollen diese Dateien gesucht und aufgelistet werden.
Beispiel:
Name des Unterordners, in welchem sich die Datei befindet lautet: TestPerson
Dieser kann sich in Z:\Soll\TestPerson\TestDatei.xlsm
oder in C:\Soll\TestPerson\TestDatei.xlsm befinden.
Ich möchte nun, dass dieser Unterordner durchsucht wird und die Dateien in
z.B. Tabelle1 Spalte B aufgelistet werden.
Wenn möglich soll auch noch der komplette Pfad in Zelle aufgelistet werden.
Ist dies möglich?
Besten Dank für eure Hilfe.
Gruss
Peter

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: DOS: dir /s *.xls? > liste.txt
25.07.2017 08:05:12
Fennek
Hallo,
für eine einmalige Nutzung ist es am einfachsten, den DOS Befehl "dir" mit dem Schalter "/s" zu nutzen.
mfg
AW: DOS: dir /s *.xls? > liste.txt
25.07.2017 08:07:14
Peter
Hallo Fennek,
besten Dank für Deine Info. Es soll aber als Makro in einem Programm funktionieren.
Kennst Du hier auch eine Lösung?
Gruss
Peter
AW: "Suercode" von snb
25.07.2017 08:40:42
snb
Hallo,
DOS kenne ich seit Jahren, der folgende Code nutzt dies aus xl-VBA und ist bei snb abgeschaut:

Sub M_snb()
sn = Split(CreateObject("wscript.shell").exec("cmd /c Dir ""V:\xxx\xx\x\*blabla*.xls"" /b/s"). _
stdout.readall, vbCrLf)
end sub
Da Auslesen des 1-dim Arrays "sn" musst du selbst können.
Der Code schafft Leerzeichen im Pfad/Datei-Namen, aber keine Umlaute. Dann müßte eine API genutzt werden.
mfg
Anzeige
AW: "Supercode" von snb owT
25.07.2017 08:41:19
snb
AW: DOS: dir /s *.xls? > liste.txt
25.07.2017 08:42:39
UweD
Hallo
so?
Sub Alle_Dateien_Verzeichnis() ' 
    On Error GoTo Fehler
    Dim Pfad, ARR, TB As Worksheet, i As Integer
    Dim Teilpfad As String, Ext As String, Datei As String
    
    Set TB = Sheets("Tabelle1")
    ARR = Array("C:", "Z:")
    Teilpfad = "\Soll\TestPerson\"
    Ext = "*.xlsm"
    
    For Each Pfad In ARR
        
        Datei = Dir(Pfad & Teilpfad & Ext)
        
        Do While Len(Datei) > 0
            i = i + 1
            TB.Cells(i, 2) = Pfad & Teilpfad & Datei
            
            Datei = Dir() ' nächste Datei 
        Loop
    Next
    
    Err.Clear
Fehler:
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
        Err.Number & vbLf & Err.Description: Err.Clear
End Sub

LG UweD
Anzeige
Klappt fast richtig
25.07.2017 09:00:02
Peter
Hallo Uwe,
besten Dank. Habe das gleich mal ausprobiert.
Der Pfad unter welcher die Dateien sich befinden lautet bei mir:
C:\Users\Peter\Documents\Soll\TestPerson\
Auf den anderen PC ist jedoch alles was vor \Soll\TestPerson\ kommt anderst.
D. h. ich benötige hier eine variable hinsichtlich User als auch restlichem Teilpfad (Hier:Documents).
Ist das lösbar?
Besten Dank für Deine Hilfe.
Gruss
Peter
User variable eingefügt
25.07.2017 09:22:36
Peter
Hallo Uwe,
ich habe in Deinen Code mal die User Variable eingefügt:
Sub Alle_Dateien_Verzeichnis_VariableUsername() '
On Error GoTo Fehler
Dim Pfad, ARR, TB As Worksheet, i As Integer
Dim Teilpfad As String, Ext As String, Datei As String
'eingefügt
Dim UserName As String
UserName = Environ("username")
Set TB = Sheets("Tabelle1")
ARR = Array("C:", "Z:")
'   Teilpfad = "\Users\Peter\Documents\Soll\TestPerson\"
Teilpfad = "\Users\" & UserName & "\Documents\Soll\TestPerson\"
'    Debug.Print Teilpfad
Ext = "*.xlsm"
For Each Pfad In ARR
Datei = Dir(Pfad & Teilpfad & Ext)
Do While Len(Datei) > 0
i = i + 1
TB.Cells(i, 2) = Pfad & Teilpfad & Datei
Datei = Dir() ' nächste Datei
Loop
Next
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & _
Err.Number & vbLf & Err.Description: Err.Clear
End Sub

Das funktioniert einwandfrei zumindest nach meiner Meinung.
Jetzt würde mir nur noch die Problemlösung fehlen für alles was dazwischen fehlt:
C:\Users\Username\.....\Soll\TestPerson\
Gibt es hier eine Lösung?
Danke für Deine Hilfe.
Gruss
Peter
Anzeige
AW: User variable eingefügt
25.07.2017 09:25:17
UweD
Hallo
so?
Sub Alle_Dateien_Verzeichnis() ' 
    On Error GoTo Fehler
    Dim Pfad, ARR, TB As Worksheet, i As Integer
    Dim UP As String, Teilpfad As String, Ext As String, Datei As String
    
    Set TB = Sheets("Tabelle1")
    ARR = Array("C:", "Z:")
    UP = Environ("USERPROFILE") 'Pfad des Nutzerprofils 
    Teilpfad = Mid(UP, 3) & "\Documents\Soll\TestPerson\" 'ohne Laufwerk 
    Ext = "*.xlsm"
    
    For Each Pfad In ARR
        
        Datei = Dir(Pfad & Teilpfad & Ext)
        
        Do While Len(Datei) > 0
            i = i + 1
            TB.Cells(i, 2) = Pfad & Teilpfad & Datei
            
            Datei = Dir() ' nächste Datei 
        Loop
    Next
    
    Err.Clear
Fehler:
    If Err.Number <> 0 Then MsgBox "Fehler: " & _
        Err.Number & vbLf & Err.Description: Err.Clear
End Sub
LG UweD
Anzeige
AW: User variable eingefügt
25.07.2017 09:27:30
UweD
Teilpfad = "\Users\" & Environ("USERNAME") & "\Documents\Soll\TestPerson\"
geht natürlich auch
Missverständnis
25.07.2017 10:00:08
Peter
Hallo Uwe,
es funktioniert wunderbar.
Das Problem mit den Laufwerken ist gelöst, das Problem mit den Usern ist gelöst.
Das Problem Ordner zwischen User und \Soll\Testperson\ ist nicht gelöst.
Ich müsste praktisch alle Ordner und Unterordner von C:\ und Z:\ auflisten lassen und \Soll\Testperson\
suchen - dann hätte ich den richtigen Weg.
Das wollte ich eigentlich verhindern.
Gruss
Peter
Nur Userverzeichnis oder SpecialFolder?
25.07.2017 12:02:05
Zwenn
Hallo Peter,
irgendwie hast Du Dein Problem noch immer nicht richtig beschrieben. Am Anfang hast Du was von einem Pfad erzählt, der aber unterschiedlich sein kann. Im Verlauf des Threads stellt sich raus, es handelt sich um Pfade auf zwei verschiedenen PCs und diese sind nix anderes als die Benutzerkonten auf verschiedenen Systemlaufwerken (C: und Z:).
Um dieses Verzeichnis anzusprechen, egal welchen Buchstaben das Systemlaufwerk hat und egal, wie der Username ist, reicht folgende Zeile:
Cells(1, 1).Value = Environ("USERPROFILE")
Damit bekommst Du LAUFWERKSBUCHSTABE:\Users\USERNAME geliefert. Also C: oder Z: oder sonstwas auf einem dritten PC und den Pfad ins Userverzeichnis.
Jetzt fehlt Dir noch ein variables Verzeichnis, von dem mir nicht klar ist, welches das sein soll. In Deinem Beispiel ist es Documents. Das ist unter Windows ein SpecialFolder. Die kann man zwar nicht einfach als Systemvariable abrufen, aber natürlich gibt es auch daür eine Lösung.
Wende Lösung 2 des folgenden Links an, wenn Dein gesuchter Pfad ein SpecialFolder ist:
https://dbwiki.net/wiki/VBA_Tipp:_Spezielle_Verzeichnisse_ermitteln
Ich habe das grade ausprobiert. Das funktioniert ganz hervorragend.
Viele Grüße,
Zwenn
Anzeige
AW: Nur Userverzeichnis oder SpecialFolder?
25.07.2017 16:08:31
Peter
Hallo Zwenn,
ich habe mein Problem schon richtig beschrieben.
Die Dateien können entweder in Laufwerk C oder Z abgespeichert sein.
Es geht darum, dass ich die aktuellen Dateien auflisten muss, welche sich im Unterverzeichnis
Testperson befinden.
Was zwischen C:\ bwz Z:\ und \Testperson\ liegt kann variabel sein.
Und genau hier liegt das Problem.
Hast Du mein Problem jetzt verstanden?
Besten Dank für Deine Hilfe.
Gruss
Peter
AW: Nur Userverzeichnis oder SpecialFolder?
25.07.2017 16:56:05
Zwenn
Hallo Peter,
Du hast in einem Posting weiter oben geschrieben
Jetzt würde mir nur noch die Problemlösung fehlen für alles was dazwischen fehlt:
C:\Users\Username\.....\Soll\TestPerson\

Im gleichen Posting steht im Quellcode:
Teilpfad = "\Users\" & UserName & "\Documents\Soll\TestPerson\"
Der einzige Unterschied ist also das Verzeichnis Documents. Genau das ist aber ein SpecialFolder, den man einfach vom System bekommt, ganz egal auf welchem Laufwerk, ganz egal unter welchem Usernamen. Deshalb mein Posting.
Ist meine Annahme denn richtig, dass das gesuchte Verzeichnis immer im aktuellen Benutzerkonto abgelegt ist? Oder ist es gar kein Systemverzeichnis, in dem aber trotzdem auf jeden Fall der Benutzername vorkommt?
Du schreibst jetzt auch:
Was zwischen C:\ bwz Z:\ und \TestPerson\ liegt kann variabel sein.
Also gehört \soll nicht mit zu Deinem Standardpfad, sondern kann variabel sein? Ich frage weil bisher immer \soll\TestPerson\ im Pfad vorkam. Wenn \soll nicht standardmäßig für Deinen Pfad gesetzt ist, muss die Verzeichnisstruktur hinter dem bekannten Teil des Pfades durchlaufen werden, bis das Verzeichnis \TestPerson\ gefunden wurde.
Viele Grüße,
Zwenn
Anzeige
AW: Nur Userverzeichnis oder SpecialFolder?
25.07.2017 18:55:50
Peter
Hallo Zwenn,
es geht darum, dass mind. 6 PC existieren, welcher jeder sein eigenes Laufwerk C:\ besitzt
und ein sog. Serverlaufwerk welches im Verzeichnis mit Z:\ aufgelistet ist.
Es kann jetzt entweder im LW C oder Z der Ordner \TestPerson\ mit den entsprechenden *.xls bzw. *.xlsm
Dateien gespeichert sein.
Fester Begriff ist somit \TestPerson\.
Wie bereits Uwe in seinem Code eingebaut hat die Variable mit den beiden LW.
Für mein Programm benötige ich die Auflistung der *.xls bzw. *.xlsm Dateien, welche sich im Unter- verzeichnis \TestPerson\ befinden.
Das was also dazwischen liegt ist die sog. Variable bezüglich Pfad. Da es sein kann, dass einer dies in einem anderen Verzeichnis hinterlegt.
Damit dürfte SpezialFolder nicht zum Zuge kommen.
Ich hoffe meine Ausführungen sind hilfreich.
Gruss
Peter
Anzeige
AW: Nur Userverzeichnis oder SpecialFolder?
27.07.2017 21:15:17
Zwenn
Hallo Peter,
ich habe Dir jetzt eine Funktion gebaut, die den Verzeichnisbaum ab einem definierten Startverzeichnis rekursiv durchläuft, bis ein angegebenes Zielverzeichnis gefunden wurde. Die Fehlerbehandlungsroutine fängt Systemordner ab, für die keine Zugriffsrechte bestehen.
Du kannst in der Sub Deine benötigten Daten für Startverzeichnis, Zielverzeichnis, Tabelle in die geschrieben werden soll und Zeile ab der geschrieben werden soll einfach ändern. Das sind Variablen-, bzw. Konstantenwerte.
Die Auflistung der Dateien wird durch das Muster *.xls* gefiltert. Da musst Du mal sehen, ob dabei das rauskommt, was Du brauchst. Unter anderem werden dadurch auch .xls und .xlsb Dateien aufgelistet. Wenn Du wirklich unterschiedliche Dateierweiterungen eingeben willst, dann muss man aus der Variable ein Array machen und den Ausleseteil für die Dateien über eine Schleife für alle Endungen laufen lassen.
Das Ganze dauert je nachdem, wie tief Dein Verzeichnissbaum ab dem Startverzeichnis noch ist, unterschiedlich lange. Bei mir hat der Test ein paar Sekunden gedauert, aber ich habe natürlich einfach irgendwo in den Untiefen meiner bestehenden Verzeichnisse gesucht. Diese Untiefen sind nur nicht so richtig tief ;-)
Naja, probiers halt einfach mal aus. Den folgenden Quellcode einfach in ein Standardmodul kopieren, ggf. die oben genannten Daten anpassen und los gehts. Die Sub basiert auf dem Code von Uwe:
(Die durch die Unterstriche erzeugten Zeilenumbrüche musst Du ggf. entfernen.)

Option Explicit
Sub BestimmteDateienAusVerzeichnis()
Const zielTabellenName As String = "Tabelle1"
Dim laufwerke() As Variant
Dim laufwerk As Variant
Dim zielTabelle As Worksheet
Dim zeile As Long
Dim teilpfad As String
Dim ext As String
Dim datei As String
Dim userName As String
Dim zielVerzeichnis As String
Dim ganzerPfad As String
Dim ausgangsVerzeichnisPfad As String
zielVerzeichnis = "TestPerson"
ext = "*.xls*"
laufwerke = Array("C:", "Z:")
userName = Environ("username")
zeile = 2 'Zeile ab der die Dateien in die Ziel-Tabelle eingetragen werden
teilpfad = "\Users\" & userName & "\"
Set zielTabelle = Sheets(zielTabellenName)
For Each laufwerk In laufwerke
ausgangsVerzeichnisPfad = laufwerk & teilpfad
ganzerPfad = VerzeichnisFinden(ausgangsVerzeichnisPfad, zielVerzeichnis)
If ganzerPfad  "Falscher Pfad" Then
Exit For
End If
Next laufwerk
If ganzerPfad  "Falscher Pfad" Then
Cells(2, 1).Value = ganzerPfad
datei = Dir(ganzerPfad & ext)
Do While Len(datei) > 0
zielTabelle.Cells(zeile, 2) = datei
zeile = zeile + 1
datei = Dir() ' nächste Datei
Loop
Else
MsgBox "Der richtige Pfad wurde nicht gefunden."
End If
End Sub

Function VerzeichnisFinden(startVerzeichnisPfad As String, zielVerzeichnis As String) As String
Dim fso As Object
Dim startVerzeichnis As Object
Dim verzeichnis As Object
Dim fundVerzeichnisPfad As String
Dim unterVerzeichnisse As Object
On Error GoTo ErrorHandler
If Dir(startVerzeichnisPfad, vbDirectory)  "" Then
Set fso = CreateObject("Scripting.FileSystemObject")
Set startVerzeichnis = fso.GetFolder(startVerzeichnisPfad)
Set unterVerzeichnisse = startVerzeichnis.SubFolders
For Each verzeichnis In unterVerzeichnisse
If verzeichnis.Name  zielVerzeichnis Then
fundVerzeichnisPfad = VerzeichnisFinden(startVerzeichnisPfad & verzeichnis.Name  _
& "\", zielVerzeichnis)
If Right(fundVerzeichnisPfad, Len(zielVerzeichnis) + 1) = zielVerzeichnis & "\"  _
Then
Exit For
End If
Else
fundVerzeichnisPfad = startVerzeichnisPfad & verzeichnis.Name & "\"
Exit For
End If
Next
Set unterVerzeichnisse = Nothing
Set startVerzeichnis = Nothing
Set verzeichnis = Nothing
Set fso = Nothing
End If
If Right(fundVerzeichnisPfad, Len(zielVerzeichnis) + 1) = zielVerzeichnis & "\" Then
VerzeichnisFinden = fundVerzeichnisPfad
Else
VerzeichnisFinden = "Falscher Pfad"
End If
Exit Function
ErrorHandler:
If Err.Number = 52 Then
VerzeichnisFinden = "Falscher Pfad"
End If
End Function
Viele Grüße,
Zwenn
Anzeige
AW: Super!
28.07.2017 08:01:01
Peter
Hallo Zwenn,
ich konnte zwar das mit dem Laufwerk Z:\ noch nicht prüfen, aber das Ergebnis mit LW C:\ funktioniert
einwandfrei.
Du hast genau das gefunden was ich benötigt habe.
Kann mich nur herzlich bei Dir bedanken mit Super, super, super!
Wünsche Dir noch einen schönen Tag und ein schönes Wochenende.
Gruss
Peter
AW: Super!
28.07.2017 10:08:26
Zwenn
Hallo Peter,
freut mich, dass es jetzt so funktioniert, wie Du es Dir vorgestellt hattest. Uwe hatte mit seiner Teillösung ja schon gute Arbeit geleistet, auf die ich aufbauen konnte.
Ich habe es zwar auch nicht mit einem Netzlaufwerk ausprobiert, aber wenn das auf Z: gemappt ist, sollte das ganz genauso funktionieren. Das dauert dann nur länger. Nicht (nur) wegen der Netzwerkverbindung, sondern weil zuerst natürlich Laufwerk C: ab dem Start-Pfad durchsucht wird. Da dort kein Treffer ist, ist das sozusagen "Blindleistung", bevor überhaupt auf Z: angefangen wird zu suchen.
Wenn das Verzeichnis auf beiden Laufwerken liegt, wird es natürlich immer auf C: gefunden. Wenn Du das nicht willst oder wenn Dir die "Blindleistung" zu lange dauert, müsste man die Sub so umbauen, dass zum Makrostart abgefragt wird, welches Laufwerk durchsucht werden soll. Aber probier mit dem jetzigen Stand erstmal rum. Grundsätzlich läuft es ja.
Der Start-Pfad spart übrigens richtig Zeit. Mit Start-Pfad habe ich für mein Testverzeichnis 3.017 Aufrufe der Funktion gehabt. Es wurden also 3.017 Verzeichnisse bis zum Fund durchlaufen. Wenn man den Teil-Pfad in der Sub nur auf den Backslash setzt (also von C:\ startet), sind es auf meinem Testrechner 41.509 Aufrufe/ Verzeichnisse.
Wieviele Verzeichnisse durchlaufen werden, wenn das gesuchte sich gar nicht auf dem Laufwerk befindet habe ich jetzt nicht getestet. Das hätte für Dich aber auch keine Aussage. Ggf. musst Du das selber mal austesten.
Viele Grüße und auch Dir einen schönen Tag und ein schönes Wochenende,
Zwenn
Anzeige
AW: DOS: dir /s *.xls? > liste.txt
25.07.2017 09:02:37
Peter
Hallo Fennek,
die Lösung von UweD ist m. E. eine sehr günstige Lösung es fehlt nur noch eine Variable.
Besten Dank für Deine Hilfe
Wünsche noch einen schönen Tag.
Gruss
Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige