2016-04-19 13 views
2

Ich habe ein Excel-Tool, das die aktuelle Uhrzeit und das Datum in UTC-Zeit umwandelt und dann diese Uhrzeit und das Datum in einer Datenbank speichert (die auch eine Excel-Datei ist). Das Problem ist, dass wenn jemand in Mexiko zum Beispiel versucht, dieses Werkzeug zu benutzen, das Format des Datums anders ist (DD-MM-YY statt MM-DD-YY), und es in der Datenbank falsch gespeichert wird . Hier ist der Code, der die aktuelle Uhrzeit und das Datum zu UTC konvertiert:Probleme mit Datumsformaten VBA-Excel

Option Explicit 

Public Declare Function SystemTimeToFileTime Lib _ 
    "kernel32" (lpSystemTime As SYSTEMTIME, _ 
    lpFileTime As FILETIME) As Long 

Public Declare Function LocalFileTimeToFileTime Lib _ 
    "kernel32" (lpLocalFileTime As FILETIME, _ 
    lpFileTime As FILETIME) As Long 

Public Declare Function FileTimeToSystemTime Lib _ 
    "kernel32" (lpFileTime As FILETIME, lpSystemTime _ 
    As SYSTEMTIME) As Long 

Public Type FILETIME 
    dwLowDateTime As Long 
    dwHighDateTime As Long 
End Type 

Public Type SYSTEMTIME 
    wYear As Integer 
    wMonth As Integer 
    wDayOfWeek As Integer 
    wDay As Integer 
    wHour As Integer 
    wMinute As Integer 
    wSecond As Integer 
    wMilliseconds As Integer 
End Type 

Public Function LocalTimeToUTC(dteTime As Date) As Date 

    Dim dteLocalFileTime As FILETIME 
    Dim dteFileTime As FILETIME 
    Dim dteLocalSystemTime As SYSTEMTIME 
    Dim dteSystemTime As SYSTEMTIME 

    dteLocalSystemTime.wYear = CInt(Year(dteTime)) 
    dteLocalSystemTime.wMonth = CInt(Month(dteTime)) 
    dteLocalSystemTime.wDay = CInt(Day(dteTime)) 
    dteLocalSystemTime.wHour = CInt(Hour(dteTime)) 
    dteLocalSystemTime.wMinute = CInt(Minute(dteTime)) 
    dteLocalSystemTime.wSecond = CInt(Second(dteTime)) 

    Call SystemTimeToFileTime(dteLocalSystemTime, _ 
     dteLocalFileTime) 
    Call LocalFileTimeToFileTime(dteLocalFileTime, _ 
     dteFileTime) 
    Call FileTimeToSystemTime(dteFileTime, dteSystemTime) 

    LocalTimeToUTC = CDate(dteSystemTime.wMonth & "/" & _ 
     dteSystemTime.wDay & "/" & _ 
     dteSystemTime.wYear & " " & _ 
     dteSystemTime.wHour & ":" & _ 
     dteSystemTime.wMinute & ":" & _ 
     dteSystemTime.wSecond) 
End Function 

Und dann hier ist die Formel, die das Datum und die Zeit schreibt: localtimetoutc(NOW())

Dann habe ich nur den Wert dieser Zelle in eine sparen Variable in VBA (eine Variante Variable) und dann füge ich den Wert dieser Variablen in die Datenbank. Es funktioniert perfekt für Benutzer in den USA, aber manchmal schlägt es für nicht-amerikanische Benutzer fehl. Wie kann ich sicherstellen, dass es nicht versagt? Das heißt, wie kann ich VBA zwingen, das Format zu verwenden, das ich brauche?

Grüße,

+0

Nicht eine Gesamtlösung, aber man konnte die Werte für "MM" überprüfen, und wenn er über 12 ist, dann wissen Sie, sie MM/DD/YYYY tat , da es keinen Monat 13, 14 usw. gibt. Leider wird das nicht alles fangen ... Vielleicht kannst du die Umgebungsvariablen überprüfen und sehen. [Diese Seite] (http://www.utteraccess.com/forum/index.php?showtopic=1039007) kann helfen. – BruceWayne

+1

Anstatt "CDate" zu verwenden, verwenden Sie 'DateSerial (Jahr, Monat, Tag) + TimeSerial (Stunde, Minute, Sekunde)'. Auf diese Weise wird das Ergebnis von Datum und Uhrzeit unabhängig von der Region nicht falsch interpretiert. Dann können Sie die Zelle (n) formatieren, wie Sie möchten. – tigeravatar

+0

@tigeravatar Dann sollte ich "LocalTimeToUTC = CDate (... wSecond)" für diese Codezeile ersetzen? –

Antwort

0

Versuchen:

Public Function LocalTimeToUTC(dteTime As Date) As Date 

    Dim dteLocalFileTime As FILETIME 
    Dim dteFileTime As FILETIME 
    Dim dteLocalSystemTime As SYSTEMTIME 
    Dim dteSystemTime As SYSTEMTIME 

    dteLocalSystemTime.wYear = CInt(Year(dteTime)) 
    dteLocalSystemTime.wMonth = CInt(Month(dteTime)) 
    dteLocalSystemTime.wDay = CInt(Day(dteTime)) 
    dteLocalSystemTime.wHour = CInt(Hour(dteTime)) 
    dteLocalSystemTime.wMinute = CInt(Minute(dteTime)) 
    dteLocalSystemTime.wSecond = CInt(Second(dteTime)) 

    Call SystemTimeToFileTime(dteLocalSystemTime, _ 
     dteLocalFileTime) 
    Call LocalFileTimeToFileTime(dteLocalFileTime, _ 
     dteFileTime) 
    Call FileTimeToSystemTime(dteFileTime, dteSystemTime) 

    LocalTimeToUTC = DateSerial(dteSystemTime.wYear, dteSystemTime.wMonth, dteSystemTime.wDay) + TimeSerial(dteSystemTime.wHour, dteSystemTime.wMinute, dteSystemTime.wSecond) 
End Function 
+0

Sieht gut aus, hast du eine Chance gehabt, es zu testen? – tigeravatar

+2

Auch nach der Referenzierung Ihres Originals sollten die Variablen nicht von 'dteSystemTime' anstatt von' dteLocalSystemTime' stammen? – tigeravatar

+0

Richtig, ich werde das beheben. –