【问题标题】:How to get a DateDiff-Value in milliseconds in VBA (Excel)?如何在 VBA(Excel)中以毫秒为单位获取 DateDiff-Value?
【发布时间】:2010-10-30 16:01:21
【问题描述】:

我需要以毫秒为单位计算两个时间戳之间的差异。 不幸的是,VBA 的 DateDiff 函数不提供这种精度。 有什么解决方法吗?

【问题讨论】:

    标签: vba excel datediff


    【解决方案1】:

    如果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 毫秒(顺便说一句 GetTickCount 更糟 - 16 毫秒)。

    【讨论】:

      【解决方案2】:

      抱歉唤醒这个旧帖子,但我得到了答案:
      像这样写一个毫秒的函数:

      Public Function TimeInMS() As String
      TimeInMS = Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2) 
      End Function    
      

      在你的 sub 中使用这个函数:

      Sub DisplayMS()
      On Error Resume Next
      Cancel = True
      Cells(Rows.Count, 2).End(xlUp).Offset(1) = TimeInMS()
      End Sub
      

      【讨论】:

        【解决方案3】:

        您也可以在单元格中使用=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")
        

        【讨论】:

          【解决方案4】:

          您可以使用here描述的方法如下:-

          创建一个名为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 计时器功能的使用,但这仅精确到百分之一秒(厘秒)。

          【讨论】:

          • 请注意,虽然GetTickCount 以毫秒为单位解析,但它的精度约为 16 毫秒 see this MSDN article
          • 只是一个问题:如何计算存储在 excel 中的 2 个值之间的时间差?
          • 问题是关于如何计算VBA中两个时间戳之间的差异
          • 即Excel 纯属巧合。
          • 这根本不能回答 OP 的问题。
          【解决方案5】:

          GetTickCount 和性能计数器是必需的,如果你想去微秒.. 对于毫秒,你可以使用这样的东西..

          '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
          

          【讨论】:

            【解决方案6】:

            如果您只需要以厘秒为单位的时间,那么您不需要 TickCount API。您可以只使用所有 Office 产品中存在的 VBA.Timer 方法。

            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
            

            【讨论】:

              【解决方案7】:

              除了 AdamRalph (GetTickCount()) 描述的方法之外,您还可以这样做:

              【讨论】:

              • 使用 QPC 代替 Tickcount 有优缺点吗?
              • 使用 QueryPerformanceCounter() 需要相当多的代码。如果您已经在代码中处理性能计数器,这可能会很有用。我只是想提一下替代方案,我认为结果没有什么不同。我怀疑它无论如何归结为 GetTickCount() 内部。 :)
              猜你喜欢
              • 2019-07-31
              • 2019-08-27
              • 1970-01-01
              • 1970-01-01
              • 2013-05-26
              • 1970-01-01
              • 1970-01-01
              • 2013-04-18
              • 1970-01-01
              相关资源
              最近更新 更多