>

작업

시작 시간 (st1)과 종료 시간 (st1) 사이의 경과 시간을 측정하는 성능 테스트를 수행하고 있습니다. 밀리 초도 표시하고 싶은 경우 API 함수 GetSystemTime을 사용하고 있습니다.

GetSystemTime st1   ' get start time as system time
GetSystemTime st2   ' get end   time as system time

문제

간단히 빼는 것은 불가능합니다

st2 - st1

: 오류 13 메시지가 나타납니다. 지금까지 해결책을 찾지 못했지만 SystemTimeDiff 함수 (st1 As SYSTEMTIME, st2 As SYSTEMTIME) 주위의 간단한 해결 방법을 만드는 데 성공했습니다.

질문

더 쉬운 접근 방식이나 SystemTimeDiff 함수가 있는지 알고 싶습니다. 예를 들어 DateDiff와 비슷합니까?

코드

Option Explicit
' API Declaration
Private Declare Sub GetSystemTime Lib "kernel32" ( _
        lpSystemTime As SYSTEMTIME)
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
' ================
' Performance Test
' ================
Sub TestSystemTimeDifference()
  Dim st1       As SYSTEMTIME
  Dim st2       As SYSTEMTIME
  GetSystemTime st1     ' Start time
  ' Do something
  ' ............
  GetSystemTime st2     ' End time
' ================
  ' Show System time elapsed with milliseconds as work around
' ================
  MsgBox SystemTimeDiff(st1, st2), vbInformation, "Systemtime elapsed"
End Sub

' ==============
' My Work around
' ==============
Function SystemTimeDiff(st1 As SYSTEMTIME, st2 As SYSTEMTIME)
  Dim msec1     As Integer: Dim msec2 As Integer
  Dim timetaken As Date
  msec1 = Val(Left(Split(FormatSystemTime(st1) & ".", ".")(1) & "000", 3))
  msec2 = Val(Left(Split(FormatSystemTime(st2) & ".", ".")(1) & "000", 3))
  If msec2 < msec1 Then msec2 = msec2 + 1000
  timetaken = CDate(Split(FormatSystemTime(st2) & ".", ".")(0)) - CDate(Split(FormatSystemTime(st1), ".")(0))
  SystemTimeDiff = FormatSystemTime(st1) & vbNewLine & FormatSystemTime(st2) & vbNewLine & _
              (Format(Hour(timetaken), "00") & ":" & Format(Minute(timetaken), "00") & ":" & Format(Second(timetaken), "00")) & _
              "." & Format(msec2 - msec1, "000")
End Function
Function FormatSystemTime(st As SYSTEMTIME) As String
' Purpose: returns formatted system time with milliseconds
' cf Site: http://www.vbarchiv.net/tipps/tipp_1493-timestamp-inkl-millisekunden.html
  With st
    FormatSystemTime = Format(.wHour, "00") & ":" & Format(.wMinute, "00") & ":" & _
    Format(.wSecond, "00") & "." & Format(.wMilliseconds, "000")
  End With
End Function

  • 답변 # 1

    이것은 어때

    Private Declare Function GetTickCount Lib "kernel32" () As Long
    Sub timeMe()
        Dim start As Long, fini As Long
        Dim total As Long
        Dim ms As Long, sec As Long, min As Long, hr As Integer
        start = GetTickCount()
        Dim i, j: For i = 0 To 1000000: j = i ^ 2: Next i
        fini = GetTickCount()
        total = fini - start
    '   total = 7545023                 ' test value:    2:05:45.023
    '   total = 460382417               ' test value:  127:53:02.417
        ms = total Mod 1000
        sec = total \ 1000
        min = sec \ 60
        hr = min \ 60
        sec = sec Mod 60
        min = min Mod 60
    
        Debug.Print "runtime "; hr & ":" & Format(min, "00") & ":" & Format(sec, "00") & "." & Format(ms, "000")
    End Sub
    
    

  • 답변 # 2

    TimeGetTime 함수는 시스템이 시작된 후 밀리 초 수를 반환하며 사용하기 매우 쉽습니다.

    Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    public Sub test()
    Dim started As Long
    Dim ended   As Long   
    started = timeGetTime ' Get milliseconds since startup
    '//Do your work that you want timed here    
    ended = timeGetTime
    Debug.Print "Time Taken = " & ended - started  & " milliseconds"
    End Sub
    
    

    물론 밀리 초를 초, 분 및 시간으로 바꾸는 차이를 나눌 수 있습니다. Long 데이터 유형의 길이가 제한되어 있고 경과 시간이 약 25 일을 초과하면 음수로 설정됩니다 (VBA Long 데이터 유형의 최대 값은 2,147,483,647, 약 24.85 일임)

  • 이전 Acumatica GetLocalizedLabel 메소드가 때때로 키를 찾지 못했습니다
  • 다음 excel - VBA 이메일 본문에 변수를 삽입하는 방법