Clever-Excel-Forum

Normale Version: Excel vba Datum formatieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,
immer wieder Sonntags - bräuchte ich mal wieder Eure werte Hilfe :93:

Aus einer Datenquelle bekomme ich Datumswerte (siehe Spalte B) in dieser Form:

Tabelle7
ABC
431StellenOriginalFormatiert
432761020196102019
433791220199122019
4347115201911.05.2019
4357317201931.07.2019
436628201902.08.2019
43782208198122.08.1981
43882310201923.10.2019
43982910201929.10.2019
44081211201912.11.2019
44181311201913.11.2019
44282411201924.11.2019
44381412201914.12.2019
444665201906.05.2019
445611201901.01.2019
446612201901.02.2019
447611201901.01.2019
448611201901.01.2019
449611201901.01.2019
http://excel-inn.de/dateien/vba_beispiel..._addin.zip
http://Hajo-Excel.de/tools.htm
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 21.08 einschl. 64 Bit



In Spalte A sind die Anzahl der Stellen, in Spalte B die Original-Daten und in Spalte C die formatierten Werte.
Wie man sieht werden die ersten beiden 7-stelligen Werte nicht richtig formatiert - weil da der Monat > 9 ist.

Wie müsste das folgende Makro ergänzt/abgeändert werden um diese Fälle auch zu erfassen? Es kommt eine Fehlermeldung "Datentypen unverträglich"
Code:
Sub Datum_Umwandeln()
   'Datum umwandeln von 010205 in 01.02.05
   Dim Z As Range
   
   For Each Z In Selection
       If (Len(Z) = 8 Or Len(Z) = 7 Or Len(Z) = 6) And IsNumeric(Z) Then
           If Len(Z) = 8 Then
               Z = CDate(Mid(Z, 1, 2) & "." & Mid(Z, 3, 2) & "." & Mid(Z, 5, 4))
           ElseIf Len(Z) = 7 And IsNumeric(Z) Then
               Z = CDate(Mid(Z, 1, 2) & "." & Mid(Z, 3, 1) & "." & Mid(Z, 4, 4))
           Else
               Z = CDate(Mid(Z, 1, 1) & "." & Mid(Z, 2, 1) & "." & Mid(Z, 3, 4))
           End If
       End If
   Next Z
End Sub

Vielleicht habt Ihr mir einen Tipp wie das Makro geändert werden müsste?
Hallo, was soll denn bei 1112019 herauskommen..?
Was machst du mit z.B. 1112019 (11.01. oder 01.11.), 1122019 (01.12. oder 11.02.) ?


Da sollte eher die bereitgestellte Datenbasis geändert werden.
Hallo zusammen,

Zitat:Hallo, was soll denn bei 1112019 herauskommen..?
Zitat:Was machst du mit z.B. 1112019 (11.01. oder 01.11.), 1122019 (01.12. oder 11.02.) ?

Dass es diese Sonderfälle gibt ist mir bewusst.
Aber dort wo es eindeutiger scheint sollte es per Makro doch möglich sein die Umwandlung zu generieren. Ich habe nur keinen Plan wie.
Die restlichen Werte muss ich dann wohl von Hand bearbeiten.

Vielleicht könnt Ihr mir wenigsten für die eindeutigen Fälle eine Lösung an die Hand geben?
Du musst halt eine Plausibilitätsprüfung "IsDate(Z)" einbauen.
Guten morgen,

die Plausibilitätsprüfung "IsDate(Z)" bringt ja nur WAHR oder FALSCH. Das hilft eigentlich nicht weiter - denn -
die 6-stelligen (Datums-) Werte sollten nur richtig zerlegt und bewertet werden.

Das ist mein eigentliches Problem. Der Wert 652019 ist ein Datum und zwar der 06.05.2019. IsDate(652019) bringt hier FALSCH.
Isdate() passt doch nicht so zur Prüfung, da auch bei z.B. "02.23.2013" WAHR ausgegeben wird. Der 23. wird als Tag interpretiert und 1. als Monat.

Grundsätzlich: Erst das Datum zusammensetzen. Dann prüfen und wenn FALSCH ggf. anders zusammensetzen.

Prüfen musst du nur bei 7 Stellen.

https://www.vbarchiv.net/tipps/tipp_271-...uefen.html

Mir wäre das trotzdem zuviel manuelle Nacharbeit.
Vielen Dank für Deine Erläuterungen!

Vielleicht finde ich noch eine gangbare Lösung.
Hallo,

im Prinzip kann man folgendes feststellen:

1. Kein Problem wenn das Datum aus 6 oder 8 Zeichen besteht
2. Bei 7 Zeichen ist es kein Problem, wenn an 3. Stelle eine Zahl >= 3 steht, denn dann ist der Monat einstellig, der Tag zweistellig
2. Bei 7 Zeichen ist es kein Problem, wenn an 3. Stelle eine Zahl 0 steht, denn dann ist der Monat zweistellig, der Tag einstellig
3. Bei 7 Zeichen ist es kein Problem, wenn an 2. Stelle eine 0 oder eine Zahl > 1 steht (dann ist der Tag zweistellig)
4. Bei 7 Zeichen ist es kein Problem, wenn an 1. Stelle eine Zahl >=4 steht (dann ist der Tag einstellig und der Monat zweistellig)

Wirklich problematisch sind dann lediglich die Kombinationen:
111
211
311
112
212
Hier mal ein Beispielcode (kann sicherlich noch verbessert werden):
Code:
Sub DatumFormatieren()
Dim a, i
a = Range("B432:B449").Value2
For i = LBound(a) To UBound(a)
    If Len(a(i, 1)) = 6 Then
        a(i, 1) = DateSerial(Right$(a(i, 1), 4), Mid$(a(i, 1), 2, 1), Left$(a(i, 1), 1))
    ElseIf Len(a(i, 1)) = 8 Then
        a(i, 1) = DateSerial(Right$(a(i, 1), 4), Mid$(a(i, 1), 3, 2), Left$(a(i, 1), 2))
    Else
        If Mid$(a(i, 1), 3, 1) = "0" Or CInt(Left$(a(i, 1), 1)) >= 4 Then
            a(i, 1) = DateSerial(Right$(a(i, 1), 4), Mid$(a(i, 1), 2, 2), Left$(a(i, 1), 1))
        ElseIf CInt(Mid$(a(i, 1), 3, 1)) >= 3 Or Mid$(a(i, 1), 2, 1) <> "1" Then
            a(i, 1) = DateSerial(Right$(a(i, 1), 4), Mid$(a(i, 1), 3, 1), Left$(a(i, 1), 2))
        Else
            a(i, 1) = "N/A"
        End If
    End If
Next
Range("C432:C449").Value2 = a
End Sub
Seiten: 1 2