Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1856to1860
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datum aus Dateinamen auslesen

Datum aus Dateinamen auslesen
26.11.2021 09:03:58
Mark
Moin,
oftmals habe ich hier im Forum schon gute Hilfe gefunden, jetzt habe ich aber keinen passenden Eintrag finden können.
Mein Problem: Ich habe viele Dateien, die in ein bestimmtest Format umbenannt werden müssen und dazu benötige ich das Datum aus dem Dateinamen. Das Datum kann aber in allen möglichen Varianten vorkommen, wie z.B. 20201122 oder 2020-11-22 oder 22.11.2020 usw.
Reguläre Ausdrücke kann ich leider nicht benutzen, weil ich nur den Standardfunktionsumfang von Excel nutzen kann (Firmenpolitik)
Gibt es eine einfache Möglichkeit das Datum aus dem Dateinamen zu extrahieren? Der Dateiname liegt mir als String vor. Ich steh irgendwie auf der Leitung und komme nicht selber drauf.
Vielen Dank für jeden Zaunpfahl ;)
Grüße,
Mark

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Experimentel: Blitzvorschau
26.11.2021 09:14:33
Fennek
Hallo,
Ausgangsbedingung:
- kein VBA
- File-Namen als String in Sheet
Idee:
- nach den verschiedenen Formaten zu sortieren
- für jedes Format einzeln eine Umwandlung in ein Datum mit Blitzvorschau (Menü: Daten)
mfg
AW: Experimentel: Blitzvorschau
26.11.2021 09:31:32
Mark
Moin Fennek,
ich komme nicht an das Datum ran, somit kann ich nicht sortieren und prüfen oder ich übersehe hier etwas. VBA wäre mir am liebsten, da ich das nicht manuell machen wollte.
Das sind 2 Beispiele an Dateinamen, wie ich sie bekomme:
2021.21.11 XXXXXXX XXXX.xlsx
2021.22.11 XXXXXXX XXXX.xlsx
2021.23.11 XXXXXXX XXXX.xlsx
2021.24.11 XXXXXXX XXXX.xlsx
XXX- XXX- XXX--XXX_20211121_XXXXXXXXXX.xlsx
XXX- XXX- XXX--XXX_20211122_XXXXXXXXXX.xlsx
XXX- XXX- XXX--XXX_20211123_XXXXXXXXXX.xlsx
Es sind aber auch alle denkbaren und undenkbaren Kombinationen denkbar, da sich meine freundlichen Einreicher nicht an die Dateibenennung halten. Eigentlich sollen die alle nach dem Muster YYYYMMDD_XXX_XXXXX.xlsx benannt
Gruß,
Mark
Anzeige
AW: Datum aus Dateinamen auslesen
26.11.2021 09:30:28
UweD
Hallo
Sieh dir das mal an

Sub Test_Datum()
Dim Arr(4), Z, Ext As String
'Beispiele
Arr(1) = "20200122.txt"
Arr(2) = "ABC.txt"
Arr(3) = "2020-01-22.txt"
Arr(4) = "22.01.2020.txt"
Ext = ".txt"
For Z = 1 To 4
Arr(Z) = Replace(Arr(Z), Ext, "")
If Len(Arr(Z)) = 8 And IsNumeric(Arr(Z)) Then
Arr(Z) = Format(Arr(Z), "0000-00-00")
End If
If IsDate(Arr(Z)) Then
MsgBox Format(Arr(Z), "dd.mm.yyyy")
Else
MsgBox Arr(Z) & " ist kein Datum"
End If
Next
End Sub
LG UweD
AW: Datum aus Dateinamen auslesen
26.11.2021 09:37:28
Mark
Moin UweD,
ich schau da gleich mal rein, ob ich da was draus machen kann. Grundsätzlich steht im Dateinahmen aber noch mehr Information drin:
2021.21.11 XXXXXXX XXXX.xlsx
2021.22.11 XXXXXXX XXXX.xlsx
2021.23.11 XXXXXXX XXXX.xlsx
2021.24.11 XXXXXXX XXXX.xlsx
XXX- XXX- XXX--XXX_20211121_XXXXXXXXXX.xlsx
XXX- XXX- XXX--XXX_20211122_XXXXXXXXXX.xlsx
XXX- XXX- XXX--XXX_20211123_XXXXXXXXXX.xlsx
Ich komme an den Datumsteil nicht ran und der Datumsteil liegt in allen möglichen und unmöglichen Kombinationen vor.
Gruß,
Mark
Anzeige
AW: Datum aus Dateinamen auslesen
26.11.2021 12:52:55
UweD
Hallo nochmal
hab mal 5 Varianten abgebildet

Sub Test_Datum()
Dim Arr(6), Z, Ext As String, i As Integer
Dim TmpT As String, TmpZ As String
'Beispiele
Arr(1) = "2021.21.11 XXXXXXX XXXX.xlsx" 'falsche Reihenfolge
Arr(2) = "2021.11.21 XXXXXXX XXXX.xlsx" 'richtige Reihenfolge
Arr(3) = "XXX- XXX- XXX--XXX_20211121_XXXXXXXXXX.xlsx"
Arr(4) = "2021-11-21 XXXXXXX XXXX.xlsx"
Arr(5) = " XXXXXXX2021.11-21 XXXX.xlsx"
Arr(6) = "ABC.xlsx"
Ext = ".xlsx"
For Z = 1 To 6
Arr(Z) = Replace(Arr(Z), Ext, "")
Arr(Z) = Replace(Arr(Z), Ext, "_")
TmpZ = ""
TmpT = ""
For i = 1 To Len(Arr(Z))
If IsNumeric(Mid(Arr(Z), i, 1)) Or Mid(Arr(Z), i, 1) = "." Then
'Ziffer oder Punkt
TmpZ = TmpZ & Mid(Arr(Z), i, 1)
ElseIf i > 1 Then
If IsNumeric(Mid(Arr(Z), i - 1, 1)) _
And IsNumeric(Mid(Arr(Z), i + 1, 1)) _
And Mid(Arr(Z), i, 1) = "-" Then
'- wenn davor und danach eine Ziffer
TmpZ = TmpZ & Mid(Arr(Z), i, 1)
Else
TmpT = TmpT & Mid(Arr(Z), i, 1)
End If
Else
'Text
TmpT = TmpT & Mid(Arr(Z), i, 1)
End If
Next
If (Len(TmpZ) = 8 And IsNumeric(TmpZ)) Then
'Zahl 8 Stellig
TmpZ = Format(TmpZ, "0000-00-00")
ElseIf IsDate(TmpZ) Then
'OK
ElseIf Len(TmpZ) = 10 Then
'Wenn mit Punkt aber Monat mit Tag vertauscht
TmpZ = Split(TmpZ, ".")(0) & Split(TmpZ, ".")(2) & Split(TmpZ, ".")(1)
TmpZ = Format(TmpZ, "0000-00-00")
End If
If IsDate(TmpZ) Then
MsgBox Format(TmpZ, "YYYYMMDD") & "_" & TmpT
Else
MsgBox Arr(Z) & " ist kein Datum"
End If
Next
End Sub
LG UweD
Anzeige
AW: Datum aus Dateinamen auslesen
26.11.2021 13:07:24
Rudi
Hallo Uwe
z.B. für
Arr(1) = "2021.09.11 XXXXXXX XXXX.xlsx" 'falsche Reihenfolge
wird IsDate(TmpZ) = True und somit der 11.9.21 statt dem 9.11.21.
Alles wo stelle 6-7 &lt= 12
Gruß
Rudi
AW: Datum aus Dateinamen auslesen
26.11.2021 13:28:12
UweD
Ja, das ist eine Fehlermöglichkeit, die bestehen bleibt.
Da könnte man höchstens bei einer solchen unklaren Konstellation einen Benutzerentscheid abfragen.

Option Explicit
Sub Test_Datum()
Dim Arr(7), Z, Ext As String, i As Integer
Dim TmpT As String, TmpZ As String, JaNein
'Beispiele
Arr(1) = "2021.21.11 XXXXXXX XXXX.xlsx" 'falsche Reihenfolge automatisch berichtigen
Arr(2) = "2021.11.21 XXXXXXX XXXX.xlsx" 'richtige Reihenfolge unklar
Arr(3) = "2021.12.03 XXXXXXX XXXX.xlsx" 'richtige Reihenfolge unklar
Arr(4) = "XXX- XXX- XXX--XXX_20211121_XXXXXXXXXX.xlsx"
Arr(5) = "2021-11-21 XXXXXXX XXXX.xlsx"
Arr(6) = " XXXXXXX2021.11-21 XXXX.xlsx"
Arr(7) = "ABC.xlsx"
Ext = ".xlsx"
For Z = 1 To 7
Arr(Z) = Replace(Arr(Z), Ext, "")
Arr(Z) = Replace(Arr(Z), Ext, "_")
TmpZ = ""
TmpT = ""
For i = 1 To Len(Arr(Z))
If IsNumeric(Mid(Arr(Z), i, 1)) Or Mid(Arr(Z), i, 1) = "." Then
'Ziffer oder Punkt
TmpZ = TmpZ & Mid(Arr(Z), i, 1)
ElseIf i > 1 Then
If IsNumeric(Mid(Arr(Z), i - 1, 1)) _
And IsNumeric(Mid(Arr(Z), i + 1, 1)) _
And Mid(Arr(Z), i, 1) = "-" Then
'- wenn davor und danach eine Ziffer
TmpZ = TmpZ & Mid(Arr(Z), i, 1)
Else
TmpT = TmpT & Mid(Arr(Z), i, 1)
End If
Else
'Text
TmpT = TmpT & Mid(Arr(Z), i, 1)
End If
Next
If (Len(TmpZ) = 8 And IsNumeric(TmpZ)) Then
'Zahl 8 Stellig
TmpZ = Format(TmpZ, "0000-00-00")
ElseIf IsDate(TmpZ) Then
JaNein = MsgBox(TmpZ & vbLf & vbLf & "Tag und Monat richtig (Ja) oder vertauschen (Nein)", vbYesNo, Arr(Z))
If JaNein = vbNo Then
TmpZ = MonatTag(TmpZ)
End If
ElseIf Len(TmpZ) = 10 Then
'Wenn mit Punkt aber Monat mit Tag vertauscht
TmpZ = MonatTag(TmpZ)
End If
If IsDate(TmpZ) Then
MsgBox Format(TmpZ, "YYYYMMDD") & "_" & TmpT, , Arr(Z)
Else
MsgBox Arr(Z) & " ist kein Datum"
End If
Next
End Sub
Function MonatTag(TT)
Dim TmpZ
MonatTag = Split(TT, ".")(0) & Split(TT, ".")(2) & Split(TT, ".")(1)
MonatTag = Format(MonatTag, "0000-00-00")
End Function
LG UweD
Anzeige
AW: Beispiel-Liste
26.11.2021 10:12:09
Fennek
Hallo,
ist es möglich eine Liste der Datei-Name bereitzustellen?
mfg
z.B. mit CMD: dir *.xlsx [größer als] Liste.txt
AW: Beispiel-Liste
26.11.2021 10:40:41
Mark
Moin Fennek,
Ich kann die Liste nur in einer unkenntlich gemachten Form hier darstellen, da die Benennung schon Aufschluss geben könnte und das ist hier im Unternehmen problematisch. Grundsätzlich steht im Dateinahmen neben dem Datum noch mehr Informationen, die aber auch nicht alle gefiltert werden können. Ich wollte erst den Dateinamen um alle bekannten Teile bereinigen um nur noch das Datum zu haben, leider ist aber immer noch Ballast dabei, den ich nicht filtern kann.
Grundsätzlich sind die Daten so aufgebaut: Das X steht hier einfach für den Ballast der unterschiedlich lang und unterschiedlich formatiert ist.
2021.21.11 XXXXXXX XXXX.xlsx
2021.22.11 XXXXXXX XXXX.xlsx
2021.23.11 XXXXXXX XXXX.xlsx
2021.24.11 XXXXXXX XXXX.xlsx
XXX- XXX- XXX--XXX_20211121_XXXXXXXXXX.xlsx
XXX- XXX- XXX--XXX_20211122_XXXXXXXXXX.xlsx
XXX- XXX- XXX--XXX_20211123_XXXXXXXXXX.xlsx
Ich komme nur an den Datumsteil nicht ran und der Datumsteil liegt in allen möglichen und unmöglichen Kombinationen (oben sind "nur" 2 Beispiele) vor.
Gruß,
Mark
Anzeige
AW: Blitzvorschau geht im Beispiel
26.11.2021 12:00:38
Mark
Moin Fennek,
stimmt da kommt ein Datum bei raus.
Ich muss mir mal überlegen, ob ich das so umsetzen kann oder nicht. Im Grunde fehlt mir der Automatismus und das ich dann einen manuellen Zwischenschritt zwischen 2 Makros hätte.
Danke dir für die Idee schon einmal.
Gruß,
Mark
AW: Beispiel-Liste
26.11.2021 18:01:31
Günther
Moin Mark,
dass du nicht die echten Text-Passagen preisgibst, ist absolut verständlich und auch korrekt.
Was ich gar nicht gut finde ist, dass du nur XXX verwendest, ohne Rücksicht auf eventuelle Besonderheiten, die Excel bei der Analyse helfen könnten. Das wäre beispielsweise auch ein Hinweis, dass außerhalb des "Datums" auch noch Punkte oder Ziffern vorkommen können. Zugegeben, eine gute Anonymisierung macht Arbeit, aber schließlich willst du ja eine hochwertige Leistung ohne Bezahlung haben… Und dass du nur 2 Möglichkeiten der Darstellungsweise eines Datums aufzeigst, ist für mich gleichermaßen unverständlich. Wenn als nächstes ein Datumstext mit Bindestrich oder was auch immer vorkommt, dann geht das Ganze von vorne los und das wird eine "never ending story". ☹
Schade eigentlich …
 
Gruß
Günther  |  mein Excel-Blog
Anzeige
AW: Beispiel-Liste
27.11.2021 16:24:43
Mark
Moin Günther,
es stimmt, ich habe nicht alle möglichen Formate oder Hindernisse angegeben, aber ich suche ja nicht nach einem völlig fertigen Code den ich Copy & Paste verwenden kann, sondert es ging mir mehr um einen Zaunpfahl, mit dem ich in eine brauchbare Richtung gestoßen werde. Tatsächlich sind in den XXXX-Teilen auch noch Nummern drin, die abgefangen werden müssen. Ich habe dazu einen, für mich akzeptablen Code gefunden und stelle den vermutlich morgen allen hier zur Verfügung. Ich möchte auch die fertige Lösung "geben" und nicht nur nehmen.
Zu viele Varianten und Eckpunkte sind manchmal auch sehr schwierig. Um von A nach B durch einen Wald zu laufen, benötigt man häufig ja noch die Wegpunkte C, D usw.
Um unterschiedliche Angaben von Trennzeichen von einem Datum zu verarbeiten, gibt es ja Möglichkeiten:

myTest = "2021_12.31"
myTest = Replace(myTest, ".", "-")
myTest = Replace(myTest, "/", "-")
myTest = Replace(myTest, "_", "-")
'myTest ist jetzt "2021-12-31"
Sobald ich also morgen einen Test über die 2000+ Dateien durch habe und keine Auffälligkeiten aufgetreten sind, packe ich den Code hier bei.
Danke an dieser Stelle schon einmal an alle Anregungen, die ich hier in dem Forum bekommen habe!
Gruß,
Mark
Anzeige
AW: Datum aus Dateinamen auslesen
26.11.2021 11:03:32
Rudi
Hallo,
hilft evtl. das Erstell-/ Änderungsdatum der Dateien?
Oder kommt das Datum in den Dateien vor?
Ansonsten musst du die 'Verbrecher' mahnen.
Oder alle von Hand umbenennen. Wird ja bezahlt ;-)
Gruß
Rudi
AW: Datum aus Dateinamen auslesen
26.11.2021 11:56:30
Franzl
Hallo Fennek,
mein Vorschlag hat mit Excel wenig zu tun, aber ich denke das wäre eine Hilfe.
Denn mit diesem Programm geht eine Umbennung oder Änderung des Dateinamens sehr schnell und effektiv. Ich benutze es hauptsächlich für meine Bildersammlung, aber auch für Dateien ist es 100 % hilfreich.
Hier mal der Link zur Internetseite https://www.rename-expert.de/
Im Prgramm könnte man alle die Datein liste, die die Struktur von 2021.21.11 XXXXXXX XXXX.xlsx haben und ändern, dann eben die andere Struktur.
Nur ein Vorschlag
Anzeige
AW: Datum aus Dateinamen auslesen
26.11.2021 17:41:14
Daniel
Hi
die drei genannten Datumsvarianten kannst du mit dieser Formel aus dem Text extrahieren:
dh das wären:
- JJJJ-MM-TT
- TT.MM.JJJJ
- JJJJMMTT

=MAX(
WENNFEHLER(AGGREGAT(15;6;--TEIL(A1;ZEILE($Z$1:$Z$99);10)/(SUCHEN("?-?-?";TEIL(A1;ZEILE($Z$1:$Z$99);10))=1);1);0);
WENNFEHLER(AGGREGAT(15;6;--TEIL(A1;ZEILE($Z$1:$Z$99);10)/(SUCHEN("?.?.?";TEIL(A1;ZEILE($Z$1:$Z$99);10))=1);1);0);
WENNFEHLER(AGGREGAT(15;6;--TEXT(--TEIL(A1;ZEILE($Z$1:$Z$99);8);"0000-00-00");1);0))
in deiner Excelversion solltest du statt dem Zeile($Z$1:$Z$99) die Funktion Sequenz`(x) verwenden und für x die Maximal mögliche Länge eines Dateinamens eintragen (oder sicherheitshalber etwas länger)
wird kein Datum gefunden, ist das Ergebnis 0.
Du musst die Formel natürlich ausgiebig testen und mit deinen daten verproben, da mir hier natürlich nicht alle Sonderflälle die so vorkommen können über den Weg laufen.
Was nicht vorkommen sollte, sind Ziffernfolgen mit 8 oder mehr Ziffern, die kein Datum sind.
Gruß Daniel
Anzeige
AW: Lösung der Problemstellung
27.11.2021 16:41:46
Mark
Moin,
An dieser Stelle einmal ganz herzlichen Dank für all eure Mühen und guten Ideen! Mit eurer Hilfe habe ich für mein Problem folgenden Code erfolgreich getestet:

Sub Test_Datum()
Dim Arr(13), Z, Ext As String, i As Integer, TmpI As Integer
Dim TmpT As String, TmpZ As String, TmpL As String
Dim TmpD As Boolean
Dim TmpTest As String
'Beispiele
Arr(1) = "2021.21.11 XXXXXXX XXXX.xlsx" 'falsche Reihenfolge
Arr(2) = "2021.11.21 XXXXXXX XXXX.xlsx" 'richtige Reihenfolge
Arr(3) = "XXX- XXX- XXX--XXX_20211121_XXXXXXXXXX.xlsx"
Arr(4) = "2021-11-21 XXXXXXX XXXX.xlsx"
Arr(5) = " XXXXXXX2021.11-21 XXXX.xlsx"
Arr(6) = "ABC.xlsx"
Arr(7) = "2021.21.11 XXX795 XX5.xlsx"
Arr(8) = "2021.22.11 XXX796 XX2.xlsx"
Arr(9) = "2021.23.11 XXXX97 XX5.xlsx"
Arr(10) = "2021.24.11 XXX798 XX5.xlsx"
Arr(11) = "XXX -XXX - XXX - -XXX_20211121_XXX.xlsx"
Arr(12) = "XXX -XXX - XXX - -XXX_20211122_XX.xlsx"
Arr(13) = "XXX -XXX - XXX - -XXX_20211123_XX.xlsx"
For Z = 1 To 13
TmpZ = ""
TmpT = "0123456789.-/_"
TmpL = ""
TmpI = 0
TmpD = False 'Serie von Ziffern oder Datumstrennern
For i = 1 To Len(Arr(Z))
TmpTest = Mid(Arr(Z), i, 1)
If InStr(1, TmpT, Mid(Arr(Z), i, 1), vbTextCompare) Then 'suche nach Datumskomponente
If (IsNumeric(TmpL) Or IsNumeric(Mid(Arr(Z), i, 1))) And i - TmpI  "" Then Exit For 'Datum wurde gefunden,
'resetten (2 Sonderzeichen in Folge, Lücke, nix passendes gefunden)
TmpI = i
TmpL = ""
End If
Next i
Debug.Print "Datum: " & TmpZ
Next Z
End Sub
Function checkDate(myTest As String) As String
Dim JaNein
myTest = Replace(myTest, ".", "-") 'Punkt zu Strich
myTest = Replace(myTest, "/", "-") 'Eigentlich in Dateiname nicht erlaubt aber ggf. für andere Funktion zu gebrauchen
myTest = Replace(myTest, "_", "-") 'Unterstrich zu Strich
If Right(myTest, 1) = "-" Then
myTest = Left(myTest, Len(myTest) - 1)
End If
If Len(myTest) = 8 And IsNumeric(myTest) Then '00000000
If Not IsDate(Format(myTest, "0000-00-00")) Then
myTest = MonatTag(Format(myTest, "0000-00-00")) 'tausche Monat und Tag
Else
JaNein = MsgBox(Format(myTest, "0000-00-00") & vbLf & vbLf & "Sind Tag und Monat in der richtigen Reihenfolge (Ja) oder vertauscht (nein)?", vbYesNo, "Datum unklar")
If JaNein = vbNo Then
myTest = MonatTag(Format(myTest, "0000-00-00"))
End If
End If
myTest = Format(myTest, "0000-00-00") 'Zahl zu Datum
ElseIf Len(myTest) = 10 And Not IsDate(myTest) Then '0000-00-00
myTest = MonatTag(myTest) 'tausche Monat und Tag
myTest = Format(myTest, "0000-00-00") 'Zahl zu Datum
End If
If IsDate(myTest) Then
checkDate = myTest
End If
End Function
Function MonatTag(myTest As String) As String
myTest = Replace(myTest, ".", "-")
myTest = Replace(myTest, "/", "-")
myTest = Replace(myTest, "_", "-")
MonatTag = Split(myTest, "-")(0) & Split(myTest, "-")(2) & Split(myTest, "-")(1)
End Function
Für die produktive Anwendung muss das Array noch raus und die Variablen würde ich noch dem Namenschema anpassen, aber das geht ja recht fix.
Noch einmal Danke für alle guten Ideen!
Prima. Danke für die Rückmeldung. owT
29.11.2021 08:57:23
UweD

184 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige