Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Excel vba Datum formatieren
#1
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?
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#2
Hallo, was soll denn bei 1112019 herauskommen..?
Gruß Jörg
ich muss mich erst wieder ganz langsam heran robben. Also bitte ich um Nachsicht

"Wer immer tut, was er schon kann, bleibt immer das, was er schon ist." - Henry Ford
[-] Folgende(r) 1 Nutzer sagt Danke an Jockel für diesen Beitrag:
  • sharky51
Antworten Top
#3
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.
[-] Folgende(r) 1 Nutzer sagt Danke an Cadmus für diesen Beitrag:
  • sharky51
Antworten Top
#4
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?
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#5
Du musst halt eine Plausibilitätsprüfung "IsDate(Z)" einbauen.
[-] Folgende(r) 1 Nutzer sagt Danke an Cadmus für diesen Beitrag:
  • sharky51
Antworten Top
#6
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.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#7
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.
[-] Folgende(r) 1 Nutzer sagt Danke an Cadmus für diesen Beitrag:
  • sharky51
Antworten Top
#8
Vielen Dank für Deine Erläuterungen!

Vielleicht finde ich noch eine gangbare Lösung.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#9
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
Gruß
Michael
Antworten Top
#10
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
Gruß
Michael
[-] Folgende(r) 1 Nutzer sagt Danke an Der Steuerfuzzi für diesen Beitrag:
  • sharky51
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste