Wie kann ich mit VBA ein Datum auslesen, welches nicht als Datum formatiert ist?
Hallo zusammen,
ich möchte aus einem Bericht in einer bestimmten Spalte in Excel ein Datum aus einem Text auslesen. Da es aber nicht als Datum in Excel formatiert ist komme ich nicht weiter. Gibt es die Möglichkeit, nach einer bestimmten Zeichenfolge zu suchen? Also z.B. ZahlZahlPunktZahlZahlPunktZahlZahlZahlZahl (tt.mm.jjjj)?
Danke für eure Ideen :)
Schönen Gruß Jan
3 Antworten
Wenn du Glück hast, ist das als Text (?) gespeicherte Datum in einem Format, dass VB als Datum erkennen kann. Dann reicht ein einfaches "CDate".
Ansonsten müsstest du die Zeichenkette parsen. Das bedeutet, dass du festlegen musst: Die ersten Zeichen bis zum Punkt sind Tage, dann kommen zwei Stellen für den Monat und die letzten 4 Ziffern bilden das Jahr.
Dann kannst du dir das Datum zusammenbauen.
Es gab vor ein paar Tagen ein ähnliches Problem. Ich kram es mal hervor...
Das Datum ist leider nicht als solches formatiert, also mache ich das jetzt so:
Option Explicit
Sub date()
Dim pos1, pos2
Dim Wort As String
Dim intTag As String, intMonat As String, intJahr As String
Wort = Worksheets("Bausteinkatalog").Range("E48").Value
pos1 = InStr(Wort, ".") 'Position erster Punkt
pos2 = InStr(pos1 + 1, Wort, ".") 'Position zweiter Punkt
strTag = Mid(Wort, pos1 - 2, 2)
strMonat = Mid(Wort, pos1 + 1, 2)
strJahr = Mid(Wort, pos2 + 1, 5)
MsgBox "Tag: " & strTag & " Monat: " & strMonat & " Jahr: " & strJahr
End Sub
Und dann das ganze noch schön in ne Schleife verpacken um alle Zeilen der Spalte auszulesen ;)
Am einfachsten geht das per Regular Expression (Regulärem Ausdruck).
Dazu bindest du in der VBA-Entwicklungsumgebung unter "Verweise" den Baustein "Microsoft VBScript Regular Expressions 5.5" ein (der ist bei mir jedenfalls nicht alphabetisch einsortiert, sondern irgendwo viel weiter oben).
Dann kannst du (in deinem Beispiel) mit dem Pattern
(\d{2}\.\d{2}\.\d{4})
nach tt.mm.jjjj suchen.
In ein Datum (ggf. mit Uhrzeit) umwandeln kannst du das mit
WorksheetFunction.DateValue(Datumsstring)
bzw.
WorksheetFunction.DateValue(Datumsstring) + WorksheetFunction.TimeValue(Datumsstring)
Ich habe 3 Hilfsspalten benötigt, das Ding kann aber jetzt mehr wie du denkst: (Dein O-Text in A2)
1. Leerzeichen innerhalb des Datums entfernen in B2
=WECHSELN(A2;". ";".")
2. Suche nach ".20" (falls im 20. Jahrhundert, wenn nicht, bitte um Info) in C2
=SUCHEN(".20";B2)
3. Suche nach dem Punkt vor ".20" in D2
=SUCHEN(".";B2;C2-4)
4. Ergebnis als Datum
=WENN(ISTZAHL(A2);A2;WENNFEHLER(DATWERT(TEIL(B2;D2-2;C2-D2+7));"kein Datum gefunden"))

Alles klar, dann probiere ich das erstmal über cdate aus, alternativ dann über das (für mich noch unbekannte) parsen ;)
Vielen Dank, ich melde mich wieder