5-stellige Zahl aus dem Dateinamen finden, diese kopieren und in Excel Spalte für Spalte ganze oben einfügen

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    5-stellige Zahl aus dem Dateinamen finden, diese kopieren und in Excel Spalte für Spalte ganze oben einfügen

    Hallo zusammen,

    folgende Problemstellung: In einem Verzeichnis befinden sich mehrere xlsm-Dateien, die sich vom Dateinamen her lediglich durch eine fünfstellige Zahl voneinander unterscheiden.
    Beispiel: Verladung-AV-#####.xlsm

    Ich öffne nun ein neues leeres XLSM-Dokument. Hier möchte ich in A1 beginnend diese Nummer stehen haben.
    Das Makro soll also die erste Datei im Verzeichnis hernehmen, im Dateinamen nach der fünfstelligen Nummer suchen, nur diese kopieren und in meinem neuen XLSM-Dokument in A1 einfügen.
    Dann nimmt er sich die nächste Datei und macht das gleiche, fügt die fünfstellige Nummer in B1 ein, usw. Bis alle 1000 Nummern in der obersten Zeile Spalte für Spalte nebeneinander stehen.

    Wie geht so etwas? Macht man das mit dem FileSystem-Objekt?


    Gruß
    IrishStu
    @IrishStu,

    wie es aussieht steht deine 5stellige Zahl immer vor der Erweiterung.
    Hier bieten sich aus meiner Sicht zwei Ansätze an.

    1. Du arbeitest mit

    VB.NET-Quellcode

    1. SubString(start, länge)

    Wobei natürlich start immer von der Länge des Dateinamens abhägig ist und länge deine 5 ist.
    2. Du holst dir den Dateinamen ohne Erweiterung

    VB.NET-Quellcode

    1. System.IO.Path.GetFilenameWithoutExtension(Dateiname)

    Danach wieder mit substring arbeiten, wobei du die länge nicht mehr angeben musst, sondern nur die startposition

    Gruss

    mikeb69
    Vielen Dank schonmal an euch Beide. Es ist allerdings leider nicht so, dass die Startposition der Nummer immer an der selben Stelle liegt.
    Es ist also nötig, die Zahlen zu finden. Es wäre möglich, dass nach der ersten Zahl gesucht werden soll und bis zur letzten Zahl der Substring weiter Zahlen aufnehmen soll, bis es eben keine mehr gibt, d.h. bis alle 5 durchlaufen sind. Die 5 Nummern sind ja die einzigen Zahlen, welche es gibt. Das ist immer so. Ich vermute, dass die Lösung mit Regex funktioniert. DAmit kann man ja immer nach einem beliebigen Stringmuster suchen.
    Vielleicht gibt es aber auch noch eine einfachere Möglichkeit?
    VBA hat kein Regex, so weit ich mich erinnern kann...
    Aber du kannst dein Schema
    Verladung-AV-#####.xlsm
    mit der Split-Funktion nach '-' aufsplitten und den letzten Teil nochmals nach '.' splitten und dann davon den 1. Teil hernehmen -> ist dann deine gesuchte Zahl...
    Man könnte eine Schleife über jedes Zeichen in dem Dateinamen machen und die Zahlen herausfiltern.

    Visual Basic-Quellcode

    1. Function Extract_Numbers(StartString As String) As String
    2. Dim Number As String
    3. Dim i As Integer
    4. Number = ""
    5. For i = 1 To Len(StartString)
    6. Select Case Asc(Mid(StartString, i, 1))
    7. Case 48 To 57
    8. Number = Number & Mid(StartString, i, 1)
    9. End Select
    10. Next 'i
    11. Extract_Numbers = Number
    12. End Function


    Oder die Variante mit RegEx

    Visual Basic-Quellcode

    1. Public Function GetNumber(ByVal vstrInString As String) As String
    2. Dim mc As Object
    3. With CreateObject("VBScript.RegExp")
    4. .Pattern = "[\d]+"
    5. Set mc = .Execute(vstrInString)
    6. If (mc.Count > 0) Then
    7. GetNumber = mc(0)
    8. End If
    9. Set mc = Nothing
    10. End With
    11. End Function
    Hallo IrishStu,
    FSO kannst du verwenden, musst du aber nicht.
    Probier' mal dies:

    Visual Basic-Quellcode

    1. Dim Dat2$, Out$, i&
    2. Dat2 = Dir$("C:\DeinOrdner\*.xlsm")
    3. Out = ""
    4. Do Until Dat2 = ""
    5. For i = 1 To Len(Dat2)
    6. If Mid$(Dat2, i, 1) Like "#" Then Exit For
    7. Next i
    8. Out = Out & CStr(Val(Mid$(Dat2, i))) & vbCr
    9. Dat2 = Dir$
    10. DoEvents
    11. Loop
    12. MsgBox Out
    Gruss,

    Neptun