Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 通过GetTickCount获取代码运行时,并以特定的方式对其进行格式化_Vba_Excel_Excel 2007_Excel 2013 - Fatal编程技术网

Vba 通过GetTickCount获取代码运行时,并以特定的方式对其进行格式化

Vba 通过GetTickCount获取代码运行时,并以特定的方式对其进行格式化,vba,excel,excel-2007,excel-2013,Vba,Excel,Excel 2007,Excel 2013,我正试图使VBA的GetTickCount工作,这样我就可以看到代码的运行时,但它不必非常精确 下面的代码工作得很好,但我需要做一些更改,无法解决如何实现这一点 #If Win64 Then Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #Else Public Declare Function GetTickCount Lib "kernel32" () As Long #End I

我正试图使VBA的GetTickCount工作,这样我就可以看到代码的运行时,但它不必非常精确

下面的代码工作得很好,但我需要做一些更改,无法解决如何实现这一点

#If Win64 Then
    Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
    Public Declare Function GetTickCount Lib "kernel32" () As Long
#End If

' Get first tickcount, start of code
t1 = GetTickCount

'Do stuff here
'#############
'#############
'#############

' Get second tickcount, end of code
t2 = GetTickCount

' Compare tickcounts
If t2 < t1 Then
    ' If t2 is smaller than t1 then the tickcount has been reset, use reset tick value + t2 - t1
    Application.StatusBar = "VBA Code Runtime ms: " & (4294967295# + t2) - t1
Else
    ' If t2 is bigger than t1 then just use t2 - t1
    Application.StatusBar = "VBA Code Runtime ms: " & t2 - t1
End If
#如果是Win64那么
公共声明PtrSafe函数GetTickCount Lib“kernel32”()的长度为
#否则
公共声明函数GetTickCount Lib“kernel32”()的长度为
#如果结束
'获取第一个滴答数,代码的开始
t1=GetTickCount
“在这里做事
'#############
'#############
'#############
'获取第二个滴答声计数,代码结束
t2=GetTickCount
“比较滴答声
如果t2
我希望运行时以以下方式呈现

  • 如果运行时间低于1秒,则应以毫秒为单位显示。示例:
    180毫秒
  • 如果运行时间小于1分钟但大于1秒,则应以秒(无毫秒)为单位显示。示例:
    30秒
  • 如果运行时间超过1分钟但少于1小时则应以分钟/秒为单位显示。示例:
    1分30秒
  • 如果运行时间超过1小时则应以小时、分钟和秒为单位显示示例:
    2小时、1分钟、30秒

我将如何做到这一点,任何帮助都将不胜感激。

这将使您获得您所寻求的初步结果

Sub myStopwatch()
    Dim t1 As Double, t2 As Double, et As Double, mssg As String

    Application.StatusBar = "Running..."
    Debug.Print "Start at: " & Time
    t1 = Timer

        ' do stuff here

    t2 = Timer
    Debug.Print "End at: " & Time

    et = t2 - t1 + Abs((t2 < t1) * 86400)
    mssg = "VBA Code Runtime: "
    Select Case et
        Case Is < 1
            mssg = mssg & Format(et, "0.000 \m\s")
        Case 1 To 59.999
            mssg = mssg & Format(Int(et), "0 \s") 'this one rounds down
            'mssg = mssg & Format(et\1, "0 \s") this one rounds it off up or down
        Case 60 To 3599.999
            mssg = mssg & Format(Int(et / 60), "0 \m\, ") & Format(et Mod 60, "0 \s")
        Case Is >= 3600
            mssg = mssg & Format(Int(et / 3600), "0 \h\, ") & Format(Int((et Mod 3600) / 60), "0 \m\, ") & Format(et Mod 60, "0 \s")
        Case Else
            'do nothing
    End Select

    Application.StatusBar = mssg

End Sub
子myStopwatch()
尺寸t1为双精度,t2为双精度,et为双精度,mssg为字符串
Application.StatusBar=“正在运行…”
调试。打印“开始时间:”&时间
t1=计时器
“在这里做事
t2=计时器
调试。打印“结束时间:”&时间
et=t2-t1+Abs((t2=3600
mssg=mssg&格式(Int(et/3600),“0\h\”)&格式(Int((et Mod 3600)/60),“0\m\,”)&格式(et Mod 60,“0\s”)
其他情况
“什么也不做
结束选择
Application.StatusBar=mssg
端接头
我使用了VBA内置的
计时器
而不是
GetTickCount
,因为您最多只需要10个小时<代码>计时器
在午夜重置,因此它对于延长计时会话没有用处。我已经补偿了一次午夜的营业额

如果您了解结果,请转到VBE的即时窗口(例如,
Ctrl+g
)查看实际的启动和停止时间


有关选择案例方法的更多信息,请访问。

如果运行时间为00:05:01,是否应为5分钟1秒?(注意复数和缺少相同)顺便说一句,
GetTickCount64()
将“ticker”的范围更改为2000亿天。也许你可以使用它并节省一个额外的步骤,除非你认为你的例行程序会运行那么长的时间@是的,因为时间超过1分钟,但不到1小时。它将运行的最长时间。。。大约10小时。请重新阅读我的评论,并注意分钟与分钟、秒与秒的对比。@Jeeped啊,是的,很抱歉错过了这一点,分钟与分钟或秒与秒之间其实并不重要,只需输入秒和分钟就足够了。偶数:5m 1s就足够了。所以这个版本不允许我在晚上10点运行一个8小时的脚本?如果是这样,那对我来说就是个问题:/@Ryflex——正如我在上面提供的解决方案中所说的,“我已经补偿了一次午夜营业额。”