VBA(Excel)에서 DateDiff-Value(밀리초)를 가져오는 방법은 무엇입니까?
두 타임스탬프 간의 차이를 밀리초 단위로 계산해야 합니다.안타깝게도 VBA의 DateDiff 기능은 이러한 정밀도를 제공하지 않습니다.해결 방법이 있습니까?
다음과 같은 방법을 사용할 수 있습니다.
다음 클래스 모듈을 새로 만듭니다.StopWatch다음 코드를 입력합니다.StopWatch클래스 모듈:
Private mlngStart As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Public Sub StartTimer()
mlngStart = GetTickCount
End Sub
Public Function EndTimer() As Long
EndTimer = (GetTickCount - mlngStart)
End Function
코드는 다음과 같이 사용합니다.
Dim sw as StopWatch
Set sw = New StopWatch
sw.StartTimer
' Do whatever you want to time here
Debug.Print "That took: " & sw.EndTimer & "milliseconds"
다른 방법에서는 VBA 타이머 기능을 사용하는 방법을 설명하지만 이는 100분의 1초(센티초)까지만 정확합니다.
센초 단위의 시간만 필요한 경우 TickCount API가 필요하지 않습니다.그냥 VBA를 사용하시면 됩니다.모든 Office 제품에 있는 타이머 메서드입니다.
Public Sub TestHarness()
Dim fTimeStart As Single
Dim fTimeEnd As Single
fTimeStart = Timer
SomeProcedure
fTimeEnd = Timer
Debug.Print Format$((fTimeEnd - fTimeStart) * 100!, "0.00 "" Centiseconds Elapsed""")
End Sub
Public Sub SomeProcedure()
Dim i As Long, r As Double
For i = 0& To 10000000
r = Rnd
Next
End Sub
마이크로초 단위로 이동하려면 GetTickCount 및 PerformanceCounter가 필요합니다.수천 초 동안 이런 것을 사용할 수 있습니다.
'at the bigining of the module
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 GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
'In the Function where you need find diff
Dim sSysTime As SYSTEMTIME
Dim iStartSec As Long, iCurrentSec As Long
GetLocalTime sSysTime
iStartSec = CLng(sSysTime.wSecond) * 1000 + sSysTime.wMilliseconds
'do your stuff spending few milliseconds
GetLocalTime sSysTime ' get the new time
iCurrentSec=CLng(sSysTime.wSecond) * 1000 + sSysTime.wMilliseconds
'Different between iStartSec and iCurrentSec will give you diff in MilliSecs
한다면Timer()정밀도로 충분하면 날짜와 시간을 밀리초와 결합하여 타임스탬프를 만들 수 있습니다.
Function Now2() As Date
Now2 = Date + CDate(Timer / 86400)
End Function
두 타임스탬프 간의 차이를 밀리초 단위로 계산하기 위해 타임스탬프를 뺄 수 있습니다.
Sub test()
Dim start As Date
Dim finish As Date
Dim i As Long
start = Now2
For i = 0 To 100000000
Next
finish = Now2
Debug.Print (finish - start) & " days"
Debug.Print (finish - start) * 86400 & " sec"
Debug.Print (finish - start) * 86400 * 1000 & " msec"
End Sub
그 방법의 실제 정밀도는 약 8 msec (BTW)입니다.GetTickCount16밀리초)가 더 나쁩니다.
사용할 수도 있습니다.=NOW()셀에서 석회화된 공식:
Dim ws As Worksheet
Set ws = Sheet1
ws.Range("a1").formula = "=now()"
ws.Range("a1").numberFormat = "dd/mm/yyyy h:mm:ss.000"
Application.Wait Now() + TimeSerial(0, 0, 1)
ws.Range("a2").formula = "=now()"
ws.Range("a2").numberFormat = "dd/mm/yyyy h:mm:ss.000"
ws.Range("a3").formula = "=a2-a1"
ws.Range("a3").numberFormat = "h:mm:ss.000"
var diff as double
diff = ws.Range("a3")
이 오래된 게시물을 깨워서 죄송합니다만, 저는 다음과 같은 답변을 받았습니다.
다음과 같이 밀리초에 대한 함수를 작성합니다.
Public Function TimeInMS() As String
TimeInMS = Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
End Function
하위에서 이 기능을 사용합니다.
Sub DisplayMS()
On Error Resume Next
Cancel = True
Cells(Rows.Count, 2).End(xlUp).Offset(1) = TimeInMS()
End Sub
Adam Ralph가 설명한 방법 외에 (GetTickCount()), 다음을 수행할 수 있습니다.
- 사용
QueryPerformanceCounter()그리고.QueryPerformanceFrequency()API 함수
VBA 코드의 실행 시간을 어떻게 테스트합니까? - 또는 Win32 API(예: VBScript)에 액세스할 수 없는 환경의 경우 다음과 같습니다.
http://ccrp.mvps.org/ (다운로드 섹션에서 "고성능 타이머" 설치 가능한 COM 개체를 확인합니다.무료입니다.)
언급URL : https://stackoverflow.com/questions/939230/how-to-get-a-datediff-value-in-milliseconds-in-vba-excel
'programing' 카테고리의 다른 글
| 공통 코드를 git 하위 모듈로 추가하는 데 문제가 발생했습니다. "인덱스에 이미 있습니다." (0) | 2023.05.04 |
|---|---|
| Windows에서 다른 패치를 적용하려면 어떻게 해야 합니까? (0) | 2023.04.29 |
| 코드백 내에서 제어 템플릿의 요소에 액세스하는 방법 (0) | 2023.04.29 |
| 모든 첫 글자를 대문자로 변환하고 각 단어에 대해 소문자로 유지 (0) | 2023.04.29 |
| 그리드 행 및 열 위치를 프로그래밍 방식으로 설정하는 방법 (0) | 2023.04.29 |