Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Einheitliche Datumskonvertierung
zurück: Bedingte Textverkettung mit Trennzeichen weiter: Undo im Unterformular Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
22. Okt 2009, 18:13
Rufname:

Einheitliche Datumskonvertierung - Einheitliche Datumskonvertierung

Nach oben
       Version: Office 2007

Hallo zusammen,

um ein Datum in ein verarbeitbares Format zu bringen, hat VBA in Access ja die nette Funktion "CDate". Leider arbeitet CDate wie seine anderen Cxxx-Kollegen auf regionaler Basis. So ist "12-Dez-2009" in einem deutschen Windows ein gültiges Datum, das CDate umwandeln kann, dagegen "12-Dec-2009" nicht. Hat man ein englisches Windows, ist es genau umgekehrt. Bei den längeren Pendants ("December" usw.) sieht es genauso aus.

Will man eine Excel-Datei importieren, die möglicherweise wiederum andere Formate aufweist, gibt es Probleme beim Versuch, die Daten in ein importierbares Datumsformat zu verwandeln.

Darum nun diese kleine Funktion, die alle Monate in Kurz- und Langschreibweise in beide Richtungen auszutauschen versucht und dann prüft, ob CDate damit umgehen kann und wenn ja, diesem die Konvertierung überläßt (die an sich sehr flexibel ist und nur aufwendig nachzuprogrammieren wäre). Zum Glück bietet VBA dazu die Funktion "IsDate", um einen Datumsstring auf seine "CDate-Tauglichkeit" hin zu testen.

Mit dieser Funktion kann man regional unabhängig die meisten Datumsformate in ein Standard-VBA-Datum umwandeln, das man dann weiterverarbeiten kann - entweder zur Umwandlung in einen Access-Datum-String (mit "#" umschlossen) oder für einen SQL-Server in einen SQL Datumsstring.
Code:
Public Function fnSQLDateParse(strDate As String) As Date
On Error GoTo fnSQLDateParse_Error
    Dim strDateOut As Date
    Dim strMonthE() As Variant
    Dim strMonthG() As Variant
    Dim strMonthLngE() As Variant
    Dim strMonthLngG() As Variant
    Dim i As Byte
    Dim strDateTest As String
   
    strMonthG = Array("Mär", "Mai", "Okt", "Dez")
    strMonthE = Array("Mar", "May", "Oct", "Dec")
    strMonthLngG = Array("Januar", "Februar", "März", "Mai", "Juni" _
                       , "Juli", "Oktober", "Dezember")
    strMonthLngE = Array("January", "February", "March", "May", "June" _
                       , "July", "October", "December")
    If IsDate(strDate) Then
        strDateOut = CDate(strDate)
      Else
        strDateTest = strDate
        For i = LBound(strMonthE) To UBound(strMonthE)
            strDateTest = Replace(strDateTest, strMonthE(i), strMonthG(i))
        Next i
        If IsDate(strDateTest) Then
            strDateOut = CDate(strDateTest)
          Else
            strDateTest = strDate
            For i = LBound(strMonthG) To UBound(strMonthG)
                strDateTest = Replace(strDateTest, strMonthG(i), strMonthE(i))
            Next i
            If IsDate(strDateTest) Then
                strDateOut = CDate(strDateTest)
              Else
                strDateTest = strDate
                For i = LBound(strMonthLngE) To UBound(strMonthLngE)
                    strDateTest = Replace(strDateTest, strMonthLngE(i) _
                                        , strMonthLngG(i))
                Next i
                If IsDate(strDateTest) Then
                    strDateOut = CDate(strDateTest)
                  Else
                    strDateTest = strDate
                    For i = LBound(strMonthLngG) To UBound(strMonthLngG)
                        strDateTest = Replace(strDateTest, strMonthLngG(i) _
                                            , strMonthLngE(i))
                    Next i
                    If IsDate(strDateTest) Then
                        strDateOut = CDate(strDateTest)
                      Else
                        strDateOut = ""
                    End If
                End If
            End If
        End If
    End If
    fnSQLDateParse = strDateOut
fnSQLDateParse_Exit:
    Exit Function
fnSQLDateParse_Error:
    Select Case Err
      Case Else
        MsgBox "fnSQLDateParse Error " & Err.Description
        Resume fnSQLDateParse_Exit
    End Select
End Function
Die Funktion kann für weitere Sprachen natürlich auf die gleiche Weise erweitert werden, aber mit jeder weiteren Sprache wird es sehr viel länger...Smile
In diesem Fall wäre es dann einfacher, über die Windows-API-Funktionen die eingestellte Sprache herauszufinden und in Abhängigkeit davon die richtige Umwandlung durchzuführen. Das war mir hier aber ein bißchen too much, da mir die Sprachen Deutsch und Englisch im Regelfall genügen.

Viel Spaß damit

Christian
Willi Wipp
Moderator


Verfasst am:
30. Apr 2010, 02:50
Rufname:
Wohnort: Raum Wiesbaden


AW: Einheitliche Datumskonvertierung - AW: Einheitliche Datumskonvertierung

Nach oben
       Version: Office 2007

{Dieser Beitrag nimmt das Thema aus den unbeantworteten Themen heraus}
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Probleme mit DatDiff -fünfstellige oder einheitliche Ausgabe 6 DatenbankNeuling 317 05. Nov 2010, 09:26
DatenbankNeuling Probleme mit DatDiff -fünfstellige oder einheitliche Ausgabe
Keine neuen Beiträge Access Formulare: einheitliche Feldgröße 1 IT-User 755 13. Jul 2010, 08:27
IT-User einheitliche Feldgröße
Keine neuen Beiträge Access Berichte: Etikettenhöhe ändern bzw. einheitliche Höhe erzwingen 5 fragenüberfragen 836 16. Dez 2009, 10:44
MissPh! Etikettenhöhe ändern bzw. einheitliche Höhe erzwingen
Keine neuen Beiträge Access Programmierung / VBA: Einheitliche Formulare 4 Gast 546 01. Okt 2008, 02:51
derArb Einheitliche Formulare
Keine neuen Beiträge Access Formulare: tipps zur Darstellung? (einheitliche Feldgestaltung) 5 wut 933 02. Jan 2007, 19:03
JörgG tipps zur Darstellung? (einheitliche Feldgestaltung)
Keine neuen Beiträge Access Formulare: Datumskonvertierung über berechnetes Feld 2 Latscho 671 21. Jun 2005, 14:01
Latscho Datumskonvertierung über berechnetes Feld
Keine neuen Beiträge Access Tabellen & Abfragen: Datumskonvertierung 1 Herzog Reini 700 22. Feb 2004, 15:08
Ludger Datumskonvertierung
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Excel Tricks