How to Get Time in Milliseconds using Excel VBA
The following function uses Timer function to get the milliseconds and append it to the current time
Public Function TimeInMS() As String
TimeInMS = Strings.Format(Now, "dd-MMM-yyyy HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
End Function
Timer function returns a Single representing the number of seconds elapsed since midnight.
Another method is to use API Functions as shown below
Private 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
Private Declare Sub GetSystemTime Lib "kernel32" _
(lpSystemTime As SYSTEMTIME)
Public Function TimeToMillisecond() As String
Dim tSystem As SYSTEMTIME
Dim sRet
On Error Resume Next
GetSystemTime tSystem
sRet = Hour(Now) & ":" & Minute(Now) & ":" & Second(Now) & _
":" & tSystem.wMilliseconds
TimeToMillisecond = sRet
End Function
Millisecond timer using VBA, How to get milliseconds in VBA Now() function, VBA Now() function, VBA Timer function , Excel VBA Timer, VBA Milliseconds
See also:
Be aware: Timer() does not work properly for milliseconds. In the general case, it's useful for recording seconds only.
ReplyDeleteTimer() returns a Single which, put simply, can only store 8 digits of precision.
At 12noon, the number of seconds is already 12x60x60 = 43,200. That's 6 digits already, so Timer() will only return 2 decimal places. So you might get tenths, maybe hundreds of a second.
I'm looking for a better solution, will let you know if I find something.
I wanted to generate files based on timestamp, I used c# 7 digit precision which was always unique, but the VB has milliseconds which is overwriting my files. May be there is some workaround :)
ReplyDeleteBe aware that the value returned by GetSystemTime is only updated by Windows roughly every 15 milliseconds. If you frequently request this value, you might get results like:
ReplyDelete12:52:04.080
12:52:04.080
12:52:04.080
12:52:04.080
12:52:04.080
12:52:04.096
12:52:04.096
12:52:04.096
12:52:04.096
12:52:04.096
12:52:04.112
12:52:04.112
12:52:04.112
12:52:04.112
12:52:04.112
12:52:04.127
12:52:04.127
12:52:04.127
12:52:04.127
12:52:04.127
If you're ok with your times being approximately +/- 15 ms in accuracy, it's a simple function to use.
You have tSystem which includes hour/minute/seconds. Why do you need to invoke Now? It will just add milliseconds to your time and hence reduce the accuracy of tSystem.wMilliseconds
ReplyDeleteBased on the previous comment, I have made the following change (also to ensure that hours, minutes and seconds are always returned as two digits each / with leading zeros):
ReplyDeletesRet = Right("0" & tSystem.wHour + 8 Mod 24, 2) & ":" & Right("0" & tSystem.wMinute, 2) & ":" & Right("0" & tSystem.wSecond, 2) & ":" & tSystem.wMilliseconds
Seems to be working nicely.