Nach Datei Suchen wenn Nummer eingegeben

  • Excel

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Orion.

    Nach Datei Suchen wenn Nummer eingegeben

    Tagchen Zusammen
    Ich frag mal wieder :P also ich sollte eine Exceltabelle mit Makros erstellen in welcher der User zb. 123 eingibt und per Button bestätigt dann sollen in einem Ordner mit 10 Bsp. Dateien die Dateinamen nach dieser Eingabe abgesucht werden also .contains oder so und wenn ein Treffer gefunden wurde. Soll der explorer aufmachen und die Datei vorselektiert anzeigen. Aber nicht ausgeführt.
    Meine bisherigen Versuche sind immer gescheitert und ich weiss nicht was ich immer falsch mache x.x Müsste eigentlich ja ziemlich einfach realisierbar sein.
    Hier in diesem Code habe ich überhaupt erstmal versucht die Datei auszuführen und es funzt nicht ...

    Visual Basic-Quellcode

    1. Sub oldDateiprüfung()
    2. Dateiname = Range("A22")
    3. Set fso = CreateObject("Scripting.FileSystemObject")
    4. Set fldr = fso.getFolder(ThisWorkbook.Path)
    5. Set Dateien = fldr.Files
    6. For Each datei In Dateien
    7. If datei.Name <> "*" + CStr(Dateiname) + "*" Then
    8. MsgBox "Datei gefunden!"
    9. Shell ("C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" & (ThisWorkbook.Path + "*" + CStr(Dateiname) + "*"))
    10. Else
    11. MsgBox "nope"
    12. Exit Sub
    13. End If
    14. Next
    15. End Sub
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    - Lade die Dateinamen von deinem Verzeichnis in Array
    - Gehe diese alle Durch (For Each)

    Wichtig:

    Deine Überprüfung ist falsch. (Ist nicht so wie in Java ^^)

    Visual Basic-Quellcode

    1. For each item in myArray
    2. if item.euqals("HalloWelt") Then
    3. End if
    4. ' oder
    5. if item.contains("HalloWelt") Then
    6. End if
    7. Next


    Versuche dich über den unterschied contains() und equals() schlau zu machen
    Oke, danke :D naja contains und equals hab ich in java auch benutzt xD von dem her ist es gleich.

    Visual Basic-Quellcode

    1. Set fldr = fso.getFolder(ThisWorkbook.Path)
    2. Set Dateien = fldr.Files
    3. For Each datei In Dateien

    So rufe ich doch ein array auf oder nicht?
    Edit: Naja und mit dem Part gings ja noch der part der spackt ist wohl eher dieser Teil hier:

    Visual Basic-Quellcode

    1. Shell ("C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" & (ThisWorkbook.Path + "*" + CStr(Dateiname) + "*"))
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Lingo schrieb:



    Visual Basic-Quellcode

    1. 'Bei Contains & Equals gibt es einen unterschied!

    Ist schon klar,
    contains = enthält
    equals = naja... ehm muss halt 1:1 dasselbe sein
    Edit: Lingo, das bringt auch nix wurde ja auch schon vorher so aufgerufen in Form von
    Set Dateien = fldr.Files
    xD naja egal ich mach für heute Feierabend oder so und versuchs dann nächste Woche nochmal.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Hier ein um in einem Array zu suchen. (Windowsforms Application)

    Dateinamen eines Verzeichnisses auflisten

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim myArray() As String = {"Sommer", "Winter"}
    4. For Each item In myArray
    5. If item.Equals("Sommer") Then
    6. MessageBox.Show("gefunden")
    7. Else
    8. MessageBox.Show("kein Eintrag gefunden")
    9. End If
    10. 'oder
    11. If item.Contains("So") Then
    12. MessageBox.Show("gefunden")
    13. Else
    14. MessageBox.Show("kein Eintrag gefunden")
    15. End If
    16. Next
    17. End Sub
    18. End Class
    Das Problem liegt ja nicht hier. Das Problem liegt an dem Teil die Datei auszugeben im Explorer. Da erhalte ich alle möglichen Errors. Erst das ein Objekt fehlt, dann das die Datei doch nicht gefunden wird. Aber es stimmt alles wie es soll beim Suchen der Datei.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Für den String-Vergleich würde ich den Like-Operator nehmen. Beispiel

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Action()
    3. Dim startPath, pattern
    4. startPath = "E:" ' anpassen
    5. pattern = "IMG_*.jpg" ' anpassen
    6. ListFiles startPath, pattern
    7. End Sub
    8. Private Sub ListFiles(ByVal searchPath As String, ByVal pattern As String)
    9. Dim fso, folder, fileFullname, fileName, files
    10. Set fso = CreateObject("Scripting.FileSystemObject")
    11. Set folder = fso.GetFolder(searchPath)
    12. Set files = folder.files
    13. For Each fileFullname In files
    14. ' Dateiname ermitteln
    15. fileName = Mid$(fileFullname, InStrRev(fileFullname, "") + 1)
    16. ' Dateiname mit der Suchmuster vergleichen
    17. If fileName Like pattern Then
    18. Debug.Print ("OK -> " & fileName)
    19. Else
    20. Debug.Print ("Invalid: " & fileName)
    21. End If
    22. Next
    23. End Sub


    EDIT: Der Code-Tag verschluckt mir einen Backslash in folgender Zeile
    fileName = Mid$(fileFullname, InStrRev(fileFullname, "\") + 1)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xtts02“ ()

    @xtts02
    Hab das im Übrigen so umgesetzt wie du vorgeschlagen hast, es funktioniert aber irgendwie nicht. Hab ich hier noch irgendwas falsch?

    Visual Basic-Quellcode

    1. Sub Explorer()
    2. Dim Dateipfad, pattern
    3. 'Prüfung, ob die Rechnung im gleichen Verzeichnis vorhanden ist ...
    4. Dateipfad = ThisWorkbook.Path
    5. pattern = Dateipfad & "" & "*" & Range("A22") & "*" & ".pdf"
    6. Dateiname = Range("A22")
    7. 'Aufruf Function ExistiertDatei
    8. If Not altDatei() Then
    9. MsgBox "Rechnung nicht vorhanden"
    10. ListFiles Dateipfad, pattern
    11. Else
    12. MsgBox "Rechnung " & Range("A22") & " vorhanden"
    13. 'Dateiauswahl aber Datei nicht öffnen
    14. ' /select
    15. Shell "Explorer.exe " & Dateipfad
    16. 'Datei öffnen
    17. 'Shell "Explorer.exe Dateipfad", vbNormalFocus
    18. ListFiles Dateipfad, pattern
    19. End If
    20. End Sub
    21. Private Sub ListFiles(ByVal searchPath As String, ByVal pattern As String)
    22. Dim fso, folder, fileFullname, fileName, files
    23. Set fso = CreateObject("Scripting.FileSystemObject")
    24. Set folder = fso.GetFolder(searchPath)
    25. Set files = folder.files
    26. For Each fileFullname In files
    27. ' Dateiname ermitteln
    28. fileName = Mid$(fileFullname, InStrRev(fileFullname, "") + 1)
    29. ' Dateiname mit der Suchmuster vergleichen
    30. If fileName Like pattern Then
    31. Debug.Print ("OK -> " & fileName)
    32. Else
    33. Debug.Print ("Invalid: " & fileName)
    34. End If
    35. Next
    36. End Sub

    (Die Explorer Commands nicht beachten)
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Orion schrieb:

    Hab ich hier noch irgendwas falsch?

    Einiges!
    Mein Beispiel zeigt nur die Vorgehensweise, keine endgültige Lösung für Dein Problem. Die Reihenfolge ist also
    - Alle Dateien eines Verzeichnises ermitteln
    - alle dieser Dateien durchlaufen und den Dateinamen mit der Suchmuster vergleichen.
    - Entspricht der Dateiname der Muster? Was soll geschehen? und was, wenn nicht?

    In meinem Beispiel liste ich sie einfach nur im Ausgabe-Fenster auf. Was bei Dir passieren soll, musst Du entscheiden.
    Ja das weiss ich schon ich habs in Message Boxen ausgegeben und wenn ich da filename ausgebe erhalte ich einfach ne leere Textbox. Da wird wohl irgendwas schief laufen denke ich. Nur weiss ich nicht was, er nimmt ja den Text aus der Zelle A22 und gleicht ihn mit deiner Lösung doch ab bis er die Datei finden sollte oder nicht?
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Das versteh ich nun nicht ganz... Ich brauch doch den Pfad und die Foreach Schleife was er durchlaufen soll in diesem Pfad oder? Sorry wenn ich zu Java artig denke oder so ... Aber nach Java wars so das man den Pfad angibt das Wort definiert wonach in den Files gesucht werden soll und das ganze in eine Foreach Schleife packt. Als ich es jedenfalls zuletzt angewendet hatte.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Visual Basic-Quellcode

    1. If fileName Like pattern Then
    2. Debug.Print ("OK -> " & fileName)
    3. Else
    4. Debug.Print ("Invalid: " & fileName)
    5. End If

    Hier geb ich in Form von MsgBoxen einfach fileName aus und fileName beinhaltet eben gar nichts...
    EDIT: Oke habs noch angesetzt mit dem Invalid und OK und erhalte Invalid:
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    ich verwende den Code so:

    Visual Basic-Quellcode

    1. If fileName Like pattern Then
    2. MsgBox "OK -> " & fileName
    3. Else
    4. MsgBox "Invalid: " & fileName
    5. End If

    EDIT: Das Auslesen der Dateien funktioniert so wie's soll es harkt wohl einfach nur an der Vergleichsfunktion irgendwo
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    ich sehe grade. Es ist ein Fehler im Code. Offensichtlich hat das Forum beim Einfügen des Codes den Backslash verschluckt.
    Ändere die folgende Zeile und probiere nochmal aus
    fileName = Mid$(fileFullname, InStrRev(fileFullname, "\") + 1)

    Hier wird von rechts nach links nach dem Backslash gesucht, um den Dateinamen aus dem Pfad auszuschneiden