Ordner durchsuchen und Treffer als Liste ausgeben (Excel)
Hallo!
Ich möchte durch klicken auf ein Objekt bzw. Button einen Ordner nach einer zuvor eingegebenen Nummer durchsuchen und mir das Ergebnis als Liste (nicht Excel-Liste, sondern UserForm) ausgeben lassen. Diese Liste soll als PopUp erscheinen. Wenn ich ein Ergebnis anklicke, wird die entsprechende Datei mit dem entsprechendem Programm geöffnet.
Kann mir einer helfen?
Ich möchte durch klicken auf ein Objekt bzw. Button einen Ordner nach einer zuvor eingegebenen Nummer durchsuchen und mir das Ergebnis als Liste (nicht Excel-Liste, sondern UserForm) ausgeben lassen. Diese Liste soll als PopUp erscheinen. Wenn ich ein Ergebnis anklicke, wird die entsprechende Datei mit dem entsprechendem Programm geöffnet.
Kann mir einer helfen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 79848
Url: https://administrator.de/contentid/79848
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo omochka!
Du benötigst
- Schaltfläche (in der Tabelle) "btnShowAll", Caption: "Alle zeigen", Code (die zu suchende Nummer wird in diesem Beispiel aus Zelle C5 entnommen):
- UserForm "frmOpenFile", Caption und weitere Gestaltung nach Wunsch, mit
- ListBox "lstFiles" und
- CommandButton "btnClose", Caption "Schließen"
- Code:
- ein Modul mit folgendem Code:
Gutes Gelingen!
Grüße
bastla
[Edit] Löschen der Dateiliste im ersten Sub ergänzt. [/Edit]
Du benötigst
- Schaltfläche (in der Tabelle) "btnShowAll", Caption: "Alle zeigen", Code (die zu suchende Nummer wird in diesem Beispiel aus Zelle C5 entnommen):
Private Sub btnShowAll_Click()
Datei = Dir(Fld & "\" & "*" & [C5] & "*.*")
frmOpenFile.lstFiles.Clear
Do While Datei <> ""
frmOpenFile.lstFiles.AddItem Datei
Datei = Dir
Loop
frmOpenFile.Show
End Sub
- UserForm "frmOpenFile", Caption und weitere Gestaltung nach Wunsch, mit
- ListBox "lstFiles" und
- CommandButton "btnClose", Caption "Schließen"
- Code:
Private Sub btnClose_Click()
Me.Hide
End Sub
Private Sub lstFiles_Click()
ShellExecute hWnd, "open", Fld & "\" & lstFiles.Text, "", "", SW_NORMAL
End Sub
- ein Modul mit folgendem Code:
Public Const Fld As String = "D:\Dein Ordner" 'ohne abschließenden "\", auch nicht bei Root (daher nicht "D:\", sondern nur "D:")
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nshowcmd As Long) As Long
Const SW_HIDE = 0 ' Versteckt öffnen
Const SW_MAXIMIZE = 3 ' Maximiert öffnen
Const SW_MINIMIZE = 6 ' Minimiert öffnen
Const SW_NORMAL = 1
Const SW_RESTORE = 9
Const SW_SHOWMAXIMIZED = 3
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMINNOACTIVE = 7
Const SW_SHOWNOACTIVATE = 4
Gutes Gelingen!
Grüße
bastla
[Edit] Löschen der Dateiliste im ersten Sub ergänzt. [/Edit]
Hallo omochka!
Wenn der Ordnernamen mit der Nummer übereinstimmt, ginge es so:
Soferne auch für den Ordner gilt, dass die gesuchte Nummer nur Namensbestandteil ist, oder, dass auch noch Unterordner des Ordners einbezogen werden müssten, wäre eine Suche über das "FileSystemObject" zu überlegen.
Übrigens noch ein Nachtrag (hier im Code bereits berücksichtigt): Die Liste muss mit
vor dem Befüllen gelöscht werden, da sich ansonsten noch die vorher gefundenen Einträge darin befinden. Ich trage das auch in dem in meinem vorigen Beitrag geposteten Code nach.
Grüße
bastla
Wenn der Ordnernamen mit der Nummer übereinstimmt, ginge es so:
Private Sub btnShowAll_Click()
Datei = Dir(Fld & "\" & "*" & [C5] & "*.*")
frmOpenFile.lstFiles.Clear
Do While Datei <> ""
frmOpenFile.lstFiles.AddItem Datei
Datei = Dir
Loop
Datei = Dir(Fld & "\" & [C5] & "\*.*")
Do While Datei <> ""
frmOpenFile.lstFiles.AddItem [C5] & "\" & Datei
Datei = Dir
Loop
frmOpenFile.Show
End Sub
Übrigens noch ein Nachtrag (hier im Code bereits berücksichtigt): Die Liste muss mit
frmOpenFile.lstFiles.Clear
Grüße
bastla
Hallo omochka!
Dann starten wir das Ganze eben so:
Da der relative Pfad verwendet werden soll, muss sichergestellt sein, dass die Angabe des Startordners in der Konstanten "Fld" keinen abschließenden "\" enthält - bitte bei der Deklaration der Konstanten berücksichtigen (oder, umgekehrt, dafür sorgen, dass "Fld" mit einem "\" endet und hier im Code das Anfügen des "\" weglassen).
Grüße
bastla
Dann starten wir das Ganze eben so:
Private Sub btnShowAll_Click()
'Zugriff über das VBScript-"FileSystemObject", daher das Object erzeugen
Set objFS = CreateObject("Scripting.FilesystemObject")
'Liste löschen
frmOpenFile.lstFiles.Clear
'Durchsuchen des Ordnerbaumes starten
DoFolders objFS.GetFolder(Fld) 'Startordner als Objekt übergeben
'Dateiliste fertig, UserForm anzeigen
frmOpenFile.Show
End Sub
Sub DoFolders(Folder As Object)
Dim Subfolder As Object
If LCase(Folder.Name) <> LCase("System Volume Information") Then 'nur zur Sicherheit ...
For Each File In Folder.Files 'Reihenfolge in der Ordnerstruktur von "oben" nach "unten", daher zunächst die Dateien ...
If InStr(1, File.Name, [C5], vbTextCompare) Then 'Suchkriterium im Dateinamen (allerdings inkl. Extension) enthalten?
frmOpenFile.lstFiles.AddItem Replace(File.Path, Fld & "\", "") 'relativen Pfad verwenden
End If
Next
For Each Subfolder In Folder.SubFolders ... und jetzt erst die Unterordner
DoFolders Subfolder 'Rekursiver Aufruf des Sub für Unterordner
Next
End If
End Sub
Grüße
bastla
Hallo omochka!
Da ist mir leider ein Kommentarzeichen in der Zeile "For Each Subfolder ..." abhanden gekommen (beim Posten noch schnell verschlimmbessert ) - richtig wäre:
Ansonsten klappts bei mir mit dem geposteten Code.
Grüße
bastla
Da ist mir leider ein Kommentarzeichen in der Zeile "For Each Subfolder ..." abhanden gekommen (beim Posten noch schnell verschlimmbessert ) - richtig wäre:
For Each Subfolder In Folder.SubFolders '... und jetzt erst die Unterordner
Ansonsten klappts bei mir mit dem geposteten Code.
Grüße
bastla
Hallo omochka!
Du könntest nach "If LCase ..." ein
einbauen (und ev auch auf die nächste Zeile einen Breakpoint setzen) - wenn Du jetzt direkt aus dem VBA-Editor startest (und mit Strg-G vorher das "Direktfenster" einblendest), siehst Du zumindest einmal, welcher Ordner zuletzt durchsucht wurde ...
Grüße
bastla
Du könntest nach "If LCase ..." ein
Debug.Print Folder.Name
Grüße
bastla