日時をミリ秒まで取得する方法
現在日時をミリ秒まで取得するには以下のようにいくつかの方法があります。
- GetLocalTime(Win32API)
- GetSystemTime(Win32API)
- Timer関数(VBA関数)(時刻のみ)
それぞれの特徴は以下の通りです。
| 関数 | 特徴 | 
|---|---|
| GetLocalTime | SYSTEMTIME型(※)でPCの時刻を取得します。 編集もしやすく使いやすいためオススメです。 | 
| GetSystemTime | SYSTEMTIME型(※)で日本時間の9時間前の日時(UTC)を取得します。 あまり用途は無いと思います。 | 
| Timer | 0時からの秒数をミリ秒も含めて取得します。欠点として日付が取得できません。 どうしてもWin32APIを使いたくない場合はこれを使ってください。 | 
UTCなどの詳細を知りたい方は個別に調べてください。
おススメなのはGetLocalTimeです。
上記3つの関数についてそれぞれの使い方を紹介します。
なお、いずれの方法も関数自体やPC環境ごとにミリ秒の精度に誤差があるため、実際の時刻とはどうしても数ミリ秒から数10ミリ秒程度でズレてしまうことは認識しておく必要があります。
1. GetLocalTime
GetLocalTime関数はkernel32ライブラリで定義されている外部プロシージャのため、利用する場合にはDeclareステートメントで利用を宣言しておく必要があります。
また、GetLocalTime関数は日時をSYSTEMTIME構造体で返すため、SYSTEMTIME構造体も一緒に定義しておきます。
使い方は引数にSYSTEMTIME構造体型の変数を渡して呼び出すだけです。
あとはSYSTEMTIME構造体型の変数に入っている日時情報を編集して利用します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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 '// 64bit版 #If VBA7 And Win64 Then     Declare PtrSafe Sub GetLocalTime Lib "kernel32" Alias "GetLocalTime" (lpSystemTime As SYSTEMTIME) '// 32bit版 #Else     Declare Sub GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) #End If Sub GetLocalTimeTest()     Dim t   As SYSTEMTIME     Dim s     '// 現在日時取得     Call GetLocalTime(t)     '// yyyy/mm/dd hh:mm:ss.fffに整形     s = Format(t.wYear, "0000")     s = s & "/"     s = s & Format(t.wMonth, "00")     s = s & "/"     s = s & Format(t.wDay, "00")     s = s & " "     s = s & Format(t.wHour, "00")     s = s & ":"     s = s & Format(t.wMinute, "00")     s = s & ":"     s = s & Format(t.wSecond, "00")     s = s & "."     s = s & Format(t.wMilliseconds, "000")     Debug.Print s End Sub | 
2. GetSystemTime
GetSystemTime関数の使い方はGetLocalTime関数と同じです。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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 '// 64bit版 #If VBA7 And Win64 Then     Declare PtrSafe Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime As SYSTEMTIME) '// 32bit版 #Else     Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) #End If Sub GetSystemTimeTest()     Dim t   As SYSTEMTIME     Dim s     '// 現在日時取得     Call GetSystemTime(t)     '// yyyy/mm/dd hh:mm:ss.fffに整形     s = Format(t.wYear, "0000")     s = s & "/"     s = s & Format(t.wMonth, "00")     s = s & "/"     s = s & Format(t.wDay, "00")     s = s & " "     s = s & Format(t.wHour, "00")     s = s & ":"     s = s & Format(t.wMinute, "00")     s = s & ":"     s = s & Format(t.wSecond, "00")     s = s & "."     s = s & Format(t.wMilliseconds, "000")     Debug.Print s End Sub | 
3. Timer
Timer関数で時分秒とミリ秒を取得する方法です。
例としてこんな感じで取得します。小数点以下は3桁にしています。
12:06:09.480
2つ関数がありますが、1つ目が時分秒とミリ秒をhh:mm:ss.fff形式の文字列で返す関数で、2つ目が呼び出し元です。
Timer関数の結果は秒数+ミリ秒で返ってくるため、整数部分の秒数を時分秒文字列に変換して返すようにしています。
なお、Timer関数で取得できるミリ秒部分はVariant型であれば7桁程度、Double型なら10桁程度ありますが、3桁までを採用しています。
なお、ミリ秒は小数点以下の数値になりますが、Variant型の場合はこの値が0.1未満になった場合、「0.01234567」のように小数点以下が8桁となり、VBAの場合は小数点以下が7桁を超えると指数表記の「1.234567E02」のように保持されます。
変数mをDouble型で定義すれば指数表記にはなりません。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Function GetDateTimer() As String     Dim t       As Double   '// Timer値     Dim tInt    As Long     '// Timer値の整数部分     Dim m       As Double   '// ミリ秒     Dim ret     As String   '// 戻り値     Dim iHour   As Long     '// 時     Dim iMinute As Long     '// 分     Dim iSecond As Long     '// 秒     '// Timer値を取得     t = Timer     '// Timer値の整数部分を取得     tInt = Int(t)     '// 時分秒を取得     iHour = Int(tInt / (60 * 60))     iMinute = Int((tInt - (iHour * 60 * 60)) / 60)     iSecond = tInt - (iHour * 60 * 60 + iMinute * 60)     '// Timer値の小数部分を取得     m = t - tInt     '// hh:mm:ss.fffに整形     ret = Format(iHour, "00")     ret = ret & ":"     ret = ret & Format(iMinute, "00")     ret = ret & ":"     ret = ret & Format(iSecond, "00")     ret = ret & Left(Format(m, ".0000"), 4)     GetDateTimer = ret End Function | 
| 1 2 3 | Sub GetDateTimerTest()     Debug.Print GetDateTimer End Sub | 
実行結果
F5キーをポンポンポンッと3回を押した場合の実行結果です。
16:22:03.980
16:22:04.125
16:22:04.261
日付を加えたい場合
Timer関数は日付を取れないため、日付を付けたい場合はNow関数の日付部分を利用して連結させると、日付+時刻+ミリ秒で出力することが出来ます。
ただ、レアケースですが注意点があります。
Timer関数とNow関数をそれぞれ実行しなければならないため、どうしてもそれぞれの取得日時にズレが生じます。
その際に、Timer関数実行時の日付とNow関数実行時の日付が異なる場合は、Timer関数の時分秒にNow関数の日付を連結させると、約1日のズレになってしまいます。
ズレを判定するにはTimer関数の時刻と、Date関数もしくはNow関数の時刻が逆転しているかどうかで判定します。
と、ここまで書きましたが、それだけの考慮をするぐらいであれば、最初からGetLocalTime関数を使った方がラクだと思います。