Dateien umbenennen nach Tabellenmuster mit dateinamenabgleich

  • Excel

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Markus2013.

    Dateien umbenennen nach Tabellenmuster mit dateinamenabgleich

    Hallo,


    ich durchforste nun schon seit Stunden das Internet, kann aber keine funktionierende Lösung für mein Problem finden.
    Ansätze sind zwar da, aber nie das was ich will.


    Folgende Problemstellung: DATEIEN PER VBA UMBENENNEN


    Ich bekomme von Lieferanten Bilddateien, die z.B. wie folgt benannt sind:
    135357.jpg
    135357_2.jpg
    135357Koffer.jpg
    135357-Zubehoer.jpg
    .......

    Ich muss diese Dateien mit unserem vorhandenen Artikelstamm abgleichen und die Dateien mit unserer Artikelnummer versehen.
    Aus o.g. Vier Beispielen muss also werden:
    0898815.jpg
    0898815_2.jpg
    0898815_3.jpg
    0898815_4.jpg
    ....

    Hierfür habe ich eine Exceltabelle (Artikelstamm) zur Verfügung, welche
    zum einen in Spalte A Die Werksnummer (Lieferanten-Artikelnummer) und
    zum Anderen in Spalte B meine Artikelnummer enthält.


    Also konkret: es muss Spalte für Spalte geprüft werden, ob in dem Pfad, in dem die (hier gesuchte) VBA/Excel-Datei liegt, eine oder mehrere Dateien existieren, welche in Ihren Dateinamen die in Spalte A stehenden alphanumerische Kombination (ggf. mit Sonderzeichen) enthalten. (Diese wäre in o.g. Beispiel IMMER "135357" als Lieferanten (Werks-)Nummer.
    Diese Dateien müssen entsprechend Spalte B (fortlaufend (*_2.jpg)) umbenannt werden.

    WICHTIG: Es muss immer nach dem kürzesten bzw. ersten Dateinamen gesucht werden, da Dateinamenszusätze in der Regel erst bei mehreren bilder hinzu kommen (z.B. *_Koffer.jpg)
    Sollte aber kein problem sein, da unsere Artikelnummern Gewissenhaft immer nur einmal angelegt sind.
    Wen also ein Dateiname den text aus Spalte A enthält passt es zu 99% immer.

    Ich hoffe das ist einigermaßen verständlich ausgedrückt. :D


    P.S.: Genial wäre es, wenn diese Umbenennungsprozedur 4x durchlaufen würde:
    1. mit den konkreten Dateinamen + Spalte A
    2. ohne Berücksichtigung der Sonder- und Leerzeichen in Spalte A
    3. ohne Berücksichtigung der Sonder- und Leerzeichen in den Dateinamen
    4. ohne Berücksichtigung der Sonder- und Leerzeichen in Spalte a UND den Dateinamen

    .....liegt einfach daran, dass Bilder teilweise ohne die eigentlich dazugehörigen Sonderzeichen (Artikelnummer) benannt werden oder das diese beim der eigenen Artikelpflege auch mal vergessen werden können.......
    Ich denke, so kann man dann 95% der korrekten Dateien auslesen und umbenennen.


    Viel Rede, kurzer Sinn,

    vielleicht ist das ganze ja auch nicht soooo kompliziert :whistling:

    Vielen Dank im Voraus!!!




    edit:

    Hier eine meiner Ideen, aber das deckt leider noch nicht alles ab und funktioniert nicht.
    Habe ich mir irgendwie zusammen geschnipselt....

    Visual Basic-Quellcode

    1. Sub umbenennen()
    2. Dim intRowCount As Integer, intRow As Integer
    3. Dim strOldName As String, strNewName As String
    4. 'Letzte Zeile in 2. Spalte (Spalte B) ermitteln
    5. intRowCount = Cells(Rows.Count, 2).End(xlUp).Row
    6. 'Für jede Zeile
    7. For intRow = 1 To intRowCount
    8. If Cells(intRow, 1) <> "" And Cells(intRow, 2) <> "" Then
    9. strOldName = ThisWorkbook.Path & "\" & Cells(intRow, 1).Value
    10. strNewName = ThisWorkbook.Path & "\" & Cells(intRow, 2).Value
    11. If Dir(strOldName) = "" Or Dir(strNewName) = "" Then
    12. Cells(intRow, 3) = "Y"
    13. Else
    14. Name strOldName As strNewName
    15. Cells(intRow, 3) = "X"
    16. End If
    17. End If
    18. Next intRow
    19. End Sub





    edit:

    Hallo,

    hier habe ich nochmal eine Grafik hochgeladen, die die Problematik verdeutlichen sollte:

    tiny.cc/smtdqw

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Beatminister“ ()

    Hallo,
    also ich hab mir mal nur das Hauptthema angeschaut. Einfach mal Dateien suchen die in einer Zelle sind und durch einen anderen Zelleninhalt umbenennen.

    Visual Basic-Quellcode

    1. Dim sPfad As String
    2. Dim sSearchResult As String
    3. Dim iCounter As Integer
    4. '# Grundpfad
    5. sPfad = Cells(1, 5).Value
    6. sSearchResult = Dir(sPfad + "\" + Cells(2, 1).Value + "*")
    7. If sSearchResult <> "" Then
    8. Name (sPfad + "\" + sSearchResult) As (sPfad + "\" + CStr(Cells(2, 2).Value) + ".txt")
    9. iCounter = 1
    10. sSearchResult = Dir()
    11. While sSearchResult <> ""
    12. Name (sPfad + "\" + sSearchResult) As (sPfad + "\" + CStr(Cells(2, 2).Value) + "_" + CStr(iCounter) + ".txt")
    13. sSearchResult = Dir()
    14. iCounter = iCounter + 1
    15. Wend
    16. End If


    Der Code muss na klar noch über die Anzahl der Zeilen in der Exceltabelle angepasst werden.

    Gruß Markus
    Moin Markus,


    vielen dank für deine Antwort :thumbup: . Das Script werde ich sicherlich auch noch einige male gebrauchen können.
    Leider macht es in diesem speziellen Fall nur einen kleinen Teil des gesamten aus...... :rolleyes:



    edit:

    Hallo,

    hier habe ich nochmal eine Grafik hochgeladen, die die Problematik verdeutlichen sollte:

    tiny.cc/smtdqw

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Beatminister“ ()

    Hallo,
    so...nun ein Update der Funktion. Die Logik mit...4 mal durchlaufen, was Du zuvor beschrieben hast, verstehe ich nicht. Ich hab mal genau Dein Beispiel ausprobiert und bei mir funktioniert es.

    Visual Basic-Quellcode

    1. Dim sPfad As String
    2. Dim sSearchResult As String
    3. Dim iCounter As Integer
    4. Dim iLineCounter As Integer
    5. '# Grundpfad
    6. sPfad = Cells(1, 5).Value
    7. For iLineCounter = 2 To 5
    8. '# 1. Suche nach Grundname ohne Anhaenge
    9. sSearchResult = Dir(sPfad + "\" + Cells(iLineCounter, 1).Value + ".*")
    10. If sSearchResult <> "" Then
    11. Name (sPfad + "\" + sSearchResult) As (sPfad + "\" + CStr(Cells(iLineCounter, 2).Value) + Right(sSearchResult, 4))
    12. End If
    13. '# 2. Suche nach Grundname mit Anhaenge
    14. sSearchResult = Dir(sPfad + "\" + Cells(iLineCounter, 1).Value + "_*")
    15. If sSearchResult <> "" Then
    16. iCounter = 2
    17. Name (sPfad + "\" + sSearchResult) As (sPfad + "\" + CStr(Cells(iLineCounter, 2).Value) + "_" + CStr(iCounter) + Right(sSearchResult, 4))
    18. iCounter = iCounter + 1
    19. sSearchResult = Dir()
    20. While sSearchResult <> ""
    21. Name (sPfad + "\" + sSearchResult) As (sPfad + "\" + CStr(Cells(iLineCounter, 2).Value) + "_" + CStr(iCounter) + Right(sSearchResult, 4))
    22. sSearchResult = Dir()
    23. iCounter = iCounter + 1
    24. Wend
    25. End If
    26. Next


    Ich hab mal Deine Logik übernommen und fang erst bei xxx_2 an zu zählen.

    Gruß Markus