2016-04-19 12 views
2

Excelツールを使用して、現在の時刻と日付をUTC時刻に変換し、その時刻と日付をデータベース(Excelファイルでもあります)に保存します。メキシコの誰かがこのツールを使用しようとすると、日付の形式が異なり(MM-DD-YYではなくDD-MM-YY)、データベースに正しく保存されないという問題があります。ここではUTCに現在の時刻と日付を変換するコードは次のとおりです。ここでは、その後日付形式の問題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 

とすると、日付と時刻を書き込み式である:localtimetoutc(NOW())

その後、私はちょうどには、このセルの値を保存しますVBA(バリアント変数)で変数を作成し、その変数の値をデータベースに貼り付けます。これは米国のユーザーには最適ですが、アメリカ以外のユーザーには失敗することがあります。どうすればそれが失敗しないことを確認できますか?つまり、VBAで必要な形式を使用するようにするにはどうすればよいですか。

よろしく、

+0

ないトータルソリューションが、あなたは "MM" の値をチェックすることができ、そしてそれは12の上にいた場合、あなたは彼らがMM/DD/YYYYをした知っています残念ながら、これはすべてをキャッチしません...おそらくあなたは環境変数を確認し、参照することができます。 [このページ](http://www.utteraccess.com/forum/index.php?showtopic=1039007)が役立ちます。 – BruceWayne

+1

'CDate'を使用する代わりに、' DateSerial(年、月、日)+ TimeSerial(時、分、秒) 'を使用してください。そうすれば、地域にかかわらず、日付と時刻の結果を誤って解釈することはありません。次に、必要に応じてセルをフォーマットすることができます。 – tigeravatar

+0

@tigeravatar次に、そのコード行に 'LocalTimeToUTC = CDate(... wSecond)'を置き換えてください。 –

答えて

0

試してみてください。

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

私によく見えます、あなたはそれをテストする機会がありましたか? – tigeravatar

+2

また、オリジナルを参照した後、変数が 'dteLocalSystemTime'の代わりに' dteSystemTime'から来るべきではありませんか? – tigeravatar

+0

そうですね、それを修正します。 –

関連する問題