programing

VBA(Excel)에서 DateDiff-Value(밀리초)를 가져오는 방법은 무엇입니까?

subpage 2023. 4. 29. 09:20
반응형

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

반응형