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

Forumthread: Datei suchen und öffnen

Datei suchen und öffnen
09.02.2017 00:44:43
Tommy
Hallo
ich habe schon gesucht, doch nicht das richtige gefunden.
ich habe ein Textfeld (Textbox21) und ein Button (CommandButton4).
Nun möchte ich ein Text/Zahl in die TextBox schreiben und mit dem Button in
Orden X:\\Test\ nach der Datei suchen und öffnen.
ist die Datei nicht vorhanden, demendsprechend eine Info ausgeben.
Wie kann ich das in VBA umsetzen?
Mfg
Tommy
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Datei suchen und öffnen
09.02.2017 03:26:25
Thomas
Hallo
habe heute nacht noch etwas gefunden.
leider funktioniert noch nicht alles.
ich habe in der Userform die TextBox und den Button.
Der Button funktioniert und öffnet ein Fenster mit der Eingabe der suchenden Datei.
Ich muss den genauen Namen der Datei eingeben, inkl. Ednung.
1. Hier möchte ich das er auf den Wert/Text aus der TextBox zugreift.
2. Ich möchte nur ein Teil aus dem Dateinamen eingeben (Setzt sich aus Namen und Nummer Zusammen)
die Nummer würde mir reichen.
3. Die Dateiendung ist immer gleich, daher möchte ich auf die Eingabe der Endung verzichten
Ist die Datei nicht zu finden, möchte ich gern eine Msg "Datei nicht gefunden"
Folgenden Code habe ich unter "Diese Arbeitsmappe" kopiert.

Sub suchen()
Dim intRow As Integer
Dim DirToSearch As String, FileToSearch As String
Application.DisplayStatusBar = True
DirToSearch = "\\vw.vwg\vwdfs\K-E\EA\1764\Groups\EASZ-FR17\Oelblätter"
FileToSearch = InputBox("Geben Sie einen Dateinamen ein:" & Chr(10) & _
"(z.B. Test.xls)", "Datei suchen")
If Len(DirToSearch) = 0 Then Exit Sub
GetFilesInDirectory DirToSearch, FileToSearch
LookForDirectories DirToSearch, FileToSearch
Application.StatusBar = False
End Sub
Sub LookForDirectories(ByVal DirToSearch As String, FileToSearch As String)
Dim counter As Integer
Dim i As Integer
Dim Directories() As String
Dim Contents As String
counter = 0
DirToSearch = DirToSearch & "\"
Contents = Dir(DirToSearch, vbDirectory)
On Error Resume Next
Do While Contents  ""
If Contents  "." And Contents  ".." Then
If (GetAttr(DirToSearch & Contents) And vbDirectory) = vbDirectory Then
counter% = counter% + 1
ReDim Preserve Directories(counter)
Directories(counter) = DirToSearch & Contents
End If
End If
Contents = Dir()
Loop
If counter = 0 Then Exit Sub
For i = 1 To counter
GetFilesInDirectory Directories(i), FileToSearch
Application.StatusBar = "Durchsuche Ordner " & Directories(i) & "..."
LookForDirectories Directories(i), FileToSearch
Next i
End Sub
Sub GetFilesInDirectory(ByVal DirToSearch As String, FileToSearch As String)
Dim NextFile As String
On Error Resume Next
NextFile = Dir(DirToSearch & "\" & "*.*")
Do Until NextFile = ""
If NextFile = FileToSearch Then
MsgBox DirToSearch & "\" & NextFile
Workbooks.Open (DirToSearch & "\" & NextFile)
End If
NextFile = Dir()
Loop
End Sub
Um das Makro zu starten, steht folgender Code in der Userform:
Private Sub CommandButton4_Click()
DieseArbeitsmappe.suchen
End Sub

Wie muss ich den Code anpassen, um meine Wünsche umzusetzen?
Danke Thomas
Anzeige
Das könntest Du...
09.02.2017 07:44:38
Case
Hallo, :-)
... prinzipiell so machen: ;-)
Option Explicit
' Bedingte Kompilierung - wenn 64 Bit dann...
#If Win64 Then
Private Declare PtrSafe Function SearchTreeForFile Lib "imagehlp.dll" _
(ByVal RootPath As String, ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
' ... sonst...
#Else
Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
(ByVal RootPath As String, ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
#End If
' Bedingte Kompilierung - wenn 64 Bit dann...
#If Win64 Then
Private Declare PtrSafe 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
#Else
Private 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
#End If
Private Const SW_MAXIMIZE = 3
' Dateierweiterung UND Pfad gegebenenfalls anpassen!!!
Const strPath As String = "C:\Temp\"
Const strEX As String = ".pdf"
Private Sub CommandButton1_Click()
' Variablendeklaration
' Stringvariable mit Puffer
Dim strPathName As String * 255
Dim strName As String
Dim lngTMP As Long
On Error GoTo Fin
' Textbox mit Inhalt?
If Trim(TextBox1.Text)  "" Then
' Datei suchen, wenn gefunden ist der Rückgabewert ein Long ungleich 0
lngTMP = SearchTreeForFile(strPath, "*" & TextBox1.Text & "*" & strEX, strPathName)
If lngTMP = 0 Then
' Datei nicht vorhanden!
MsgBox "File not found!"
Else
' Puffer zurechtstutzen, überflüssige Leerzeichen weg
strPathName = Left$(strPathName, InStr(1, strPathName, vbNullChar) - 1)
strName = RTrim(strPathName)
' Datei öffnen
ShellExecute 0, "Open", strName, "", "", SW_MAXIMIZE
End If
End If
Fin:
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Anpassungen nicht vergessen!
Servus
Case

Anzeige
AW: Das könntest Du...
09.02.2017 22:36:44
Thomas
Hmm.
Stehe gerade auf dem Schlauch.
Ich weiß nicht so richtig, wo in den Code hineinkopieren muss?
Alles in die Userform, oder teile in "Diese Arbeitsmappe"?
Danke für die Hilfe
AW: Das könntest Du...
09.02.2017 22:46:08
Thomas
Haken für den offenen Thread vergessen
Na ja - was soll der Code...
10.02.2017 02:41:11
Case
Hallo, :-)
... in "DieseArbeitsmappe"? Es geht doch um eine UserForm. In meinem Beispiel von oben ist es halt "TextBox1" und "CommandButton1" - das musst Du anpassen. ;-)
Servus
Case

Anzeige
AW: Na ja - was soll der Code...
10.02.2017 03:33:42
Thomas
Sorry. Ich habe noch wenig mit VBA gemacht.
Ich habe den ganzen Code unter Formulare, Userform1 reinkopiert und nur das Laufwerk und die TextBox und Commandbutton geändert.
Wenn ich nun auf Play drücke, kommt der gleich ein Fehler und bleibt bei SearchTreeForFile hängen.
Fehler beim Kompilieren: Sub oder Function nicht definiert.
Der Code sieht bei mir nun so aus:
Option Explicit
' Bedingte Kompilierung - wenn 64 Bit dann...
#If Win64 Then
Private Declare PtrSafe Function SearchTreeForFile Lib "imagehlp.dll" _
(ByVal RootPath As String, ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
#End If
' Bedingte Kompilierung - wenn 64 Bit dann...
#If Win64 Then
Private Declare PtrSafe 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
#End If
Private Const SW_MAXIMIZE = 3
' Dateierweiterung UND Pfad gegebenenfalls anpassen!!!
Const strPath As String = "X:\\Daten\Hier"
Const strEX As String = ".xls"
Private Sub CommandButton4_Click()
' Variablendeklaration
' Stringvariable mit Puffer
Dim strPathName As String * 255
Dim strName As String
Dim lngTMP As Long
On Error GoTo Fin
' Textbox mit Inhalt?
If Trim(TextBox21.Text)  "" Then
' Datei suchen, wenn gefunden ist der Rückgabewert ein Long ungleich 0
lngTMP = SearchTreeForFile(strPath, "*" & TextBox21.Text & "*" & strEX, strPathName)
If lngTMP = 0 Then
' Datei nicht vorhanden!
MsgBox "File not found!"
Else
' Puffer zurechtstutzen, überflüssige Leerzeichen weg
strPathName = Left$(strPathName, InStr(1, strPathName, vbNullChar) - 1)
strName = RTrim(strPathName)
' Datei öffnen
ShellExecute 0, "Open", strName, "", "", SW_MAXIMIZE
End If
End If
Fin:
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Wo liegt mein Fehler?
Danke nochmal für die schnelle Hilfe
Anzeige
AW: Na ja - was soll der Code...
10.02.2017 03:34:39
Thomas
Sorry. Ich habe noch wenig mit VBA gemacht.
Ich habe den ganzen Code unter Formulare, Userform1 reinkopiert und nur das Laufwerk und die TextBox und Commandbutton geändert.
Wenn ich nun auf Play drücke, kommt der gleich ein Fehler und bleibt bei SearchTreeForFile hängen.
Fehler beim Kompilieren: Sub oder Function nicht definiert.
Der Code sieht bei mir nun so aus:
Option Explicit
' Bedingte Kompilierung - wenn 64 Bit dann...
#If Win64 Then
Private Declare PtrSafe Function SearchTreeForFile Lib "imagehlp.dll" _
(ByVal RootPath As String, ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
#End If
' Bedingte Kompilierung - wenn 64 Bit dann...
#If Win64 Then
Private Declare PtrSafe 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
#End If
Private Const SW_MAXIMIZE = 3
' Dateierweiterung UND Pfad gegebenenfalls anpassen!!!
Const strPath As String = "X:\\Daten\Hier"
Const strEX As String = ".xls"
Private Sub CommandButton4_Click()
' Variablendeklaration
' Stringvariable mit Puffer
Dim strPathName As String * 255
Dim strName As String
Dim lngTMP As Long
On Error GoTo Fin
' Textbox mit Inhalt?
If Trim(TextBox21.Text)  "" Then
' Datei suchen, wenn gefunden ist der Rückgabewert ein Long ungleich 0
lngTMP = SearchTreeForFile(strPath, "*" & TextBox21.Text & "*" & strEX, strPathName)
If lngTMP = 0 Then
' Datei nicht vorhanden!
MsgBox "File not found!"
Else
' Puffer zurechtstutzen, überflüssige Leerzeichen weg
strPathName = Left$(strPathName, InStr(1, strPathName, vbNullChar) - 1)
strName = RTrim(strPathName)
' Datei öffnen
ShellExecute 0, "Open", strName, "", "", SW_MAXIMIZE
End If
End If
Fin:
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Wo liegt mein Fehler?
Danke nochmal für die schnelle Hilfe
Anzeige
Ohne 64 Bit...
10.02.2017 03:47:54
Case
Hallo, :-)
... mal so: ;-)
Option Explicit
Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
(ByVal RootPath As String, ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
Private 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
Private Const SW_MAXIMIZE = 3
' Dateierweiterung UND Pfad gegebenenfalls anpassen!!!
Const strPath As String = "C:\Temp\"
Const strEX As String = ".pdf"
Private Sub CommandButton1_Click()
' Variablendeklaration
' Stringvariable mit Puffer
Dim strPathName As String * 255
Dim strName As String
Dim lngTMP As Long
On Error GoTo Fin
' Textbox mit Inhalt?
If Trim(TextBox1.Text)  "" Then
' Datei suchen, wenn gefunden ist der Rückgabewert ein Long ungleich 0
lngTMP = SearchTreeForFile(strPath, "*" & TextBox1.Text & "*" & strEX, strPathName)
If lngTMP = 0 Then
' Datei nicht vorhanden!
MsgBox "File not found!"
Else
' Puffer zurechtstutzen, überflüssige Leerzeichen weg
strPathName = Left$(strPathName, InStr(1, strPathName, vbNullChar) - 1)
strName = RTrim(strPathName)
' Datei öffnen
ShellExecute 0, "Open", strName, "", "", SW_MAXIMIZE
End If
End If
Fin:
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Du hast hoffentlich keinen Mac?
Servus
Case

Anzeige
AW: Ohne 64 Bit...
13.02.2017 00:56:30
Thomas
hallo
Der Code läuft nun Fehlerfrei durch. Doch leider, egal was ich tue, bekomme ich immer die Meldung,
das das Dokument nicht gefunden wurde.
Liegt das vielleicht am Dateinamen? Diese lauten bzw. sind so abgespeichert:
Meíer_Test_0815.xls
Gruß
Thomas
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dateien suchen und öffnen in Excel VBA


Schritt-für-Schritt-Anleitung

Um in Excel eine Datei mithilfe von VBA zu suchen und zu öffnen, kannst du die folgenden Schritte ausführen:

  1. Erstelle eine UserForm:

    • Füge eine TextBox (z. B. TextBox21) und einen CommandButton (z. B. CommandButton4) hinzu.
  2. Füge den VBA-Code hinzu:

    • Kopiere den folgenden Code in das Code-Modul der UserForm:
    Private Sub CommandButton4_Click()
       Dim strPathName As String * 255
       Dim strName As String
       Dim lngTMP As Long
       Dim strPath As String
       Dim strEX As String
    
       ' Anpassen des Pfades und der Dateiendung
       strPath = "X:\Daten\Hier"
       strEX = ".xls"
    
       On Error GoTo Fin
    
       If Trim(TextBox21.Text) <> "" Then
           lngTMP = SearchTreeForFile(strPath, "*" & TextBox21.Text & "*" & strEX, strPathName)
           If lngTMP = 0 Then
               MsgBox "Datei nicht gefunden!"
           Else
               strPathName = Left$(strPathName, InStr(1, strPathName, vbNullChar) - 1)
               strName = RTrim(strPathName)
               ShellExecute 0, "Open", strName, "", "", SW_MAXIMIZE
           End If
       End If
    Fin:
       If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & " " & Err.Description
    End Sub
  3. Füge die benötigten API-Deklarationen hinzu:

    • Stelle sicher, dass du die folgenden Deklarationen am Anfang des Moduls hast:
    Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
    (ByVal RootPath As String, ByVal InputPathName As String, _
    ByVal OutputPathBuffer As String) As Long
    
    Private 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
  4. Testen:

    • Starte die UserForm und gib einen Teil des Dateinamens in die TextBox ein. Klicke auf den Button, um die Datei zu suchen.

Häufige Fehler und Lösungen

  • Fehler: Datei nicht gefunden:

    • Überprüfe, ob der eingegebene Dateiname korrekt ist. Achte auf Groß- und Kleinschreibung sowie mögliche Leerzeichen.
  • Fehler: Sub oder Function nicht definiert:

    • Stelle sicher, dass die API-Deklarationen korrekt in deinem Code enthalten sind.
  • Fehler beim Kompilieren:

    • Vergewissere dich, dass du alle notwendigen Module und Deklarationen in der richtigen UserForm hast.

Alternative Methoden

Eine weitere Möglichkeit, Dateien in Excel zu suchen, ist die Verwendung des Scripting.FileSystemObject. Hier ein einfaches Beispiel:

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

Dim folder As Object
Set folder = fso.GetFolder("X:\Daten\Hier")

Dim file As Object
For Each file In folder.Files
    If InStr(file.Name, TextBox21.Text) > 0 Then
        MsgBox "Gefunden: " & file.Path
    End If
Next file

Diese Methode kann in einigen Fällen schneller sein und funktioniert gut, wenn du nur nach Dateien im aktuellen Verzeichnis suchst.


Praktische Beispiele

Ein praktisches Beispiel für das Suchen und Öffnen von Dateien könnte folgendermaßen aussehen:

  1. Öffne die UserForm.
  2. Gib in TextBox21 den Namen einer Datei ein, z. B. Meier_Test_0815.
  3. Klicke auf den Button, um die Datei zu suchen.

Wenn alles korrekt eingerichtet ist, sollte die Datei geöffnet werden, sofern sie im angegebenen Verzeichnis vorhanden ist.


Tipps für Profis

  • Wildcard-Nutzung: Nutze Wildcards wie * und ?, um flexiblere Suchanfragen zu stellen.
  • Fehlerbehandlung: Implementiere eine umfassende Fehlerbehandlung, um unerwartete Probleme zu diagnostizieren.
  • Performance-Optimierung: Wenn du in großen Verzeichnissen suchst, könnte eine Implementierung mit Scripting.FileSystemObject schneller sein.

FAQ: Häufige Fragen

1. Wo sollte ich den Code platzieren? Der Code für die UserForm sollte im Code-Modul der entsprechenden UserForm stehen.

2. Kann ich auch nach Dateien in Unterordnern suchen? Ja, die implementierte Methode SearchTreeForFile sucht rekursiv in Unterordnern.

3. Was ist, wenn ich keine 64-Bit-Version von Excel habe? Stelle sicher, dass du die richtigen API-Deklarationen für deine Excel-Version verwendest. Entferne die PtrSafe-Anweisungen, wenn du eine 32-Bit-Version verwendest.

4. Wie kann ich die Dateiendung anpassen? Ändere die Konstante strEX im Code entsprechend der gewünschten Dateiendung.

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