VBA-显示子系统运行所需的时间
我试图使用以下代码来显示一系列命令运行的时间。在本例中,我希望它返回“10”或类似的值 相反,它带来了: 发生了什么,如何正确格式化VBA-显示子系统运行所需的时间,vba,excel,Vba,Excel,我试图使用以下代码来显示一系列命令运行的时间。在本例中,我希望它返回“10”或类似的值 相反,它带来了: 发生了什么,如何正确格式化 Sub timeyWimey() Dim t1 As Date Dim t2 As Date Dim timeTaken As Date t1 = Now() Application.Wait (Now + TimeValue("0:00:10")) t2 = Now()
Sub timeyWimey()
Dim t1 As Date
Dim t2 As Date
Dim timeTaken As Date
t1 = Now()
Application.Wait (Now + TimeValue("0:00:10"))
t2 = Now()
timeTaken = t2 - t1
MsgBox timeTaken
End Sub
编辑:
在一些伟大的答案之后的最终代码:
Sub timeyWimey()
'Dim t1 As Double
'Dim t2 As Double
t1 = Now()
Application.Wait (Now + TimeValue("0:00:10"))
t2 = Now()
timeTaken = t2 - t1
MsgBox Format(timeTaken, "nn:ss.000")
End Sub
结果:
砰!问题解决了!谢谢大家的帮助 日期作为数值存储在MS Access和MS Excel中。因此,如果在即时窗口(Ctrl+G)中键入
?Cdbl(now())
,您将得到如下数字:42195.5204050926
整数表示自1899年12月30日以来已经过去了多少天,小数表示当天已经过去了多少天
在你的代码中,你基本上是这样说的:
timeTaken = 42195.5222337963 - 42195.5204050926
在本例中,我只是在几分钟后反复检查了Now()。所以我最终得到了0.0018287037
现在,如果我使用一个Date
变量来显示它,比如在你的例子中,我基本上是说它在0.0018287037
的时间是1899年12月30日,12:02:38 am
您可以通过返回即时窗口并键入?cdate(0.0018287037)
直观地看到这一点,您将得到如下结果:12:02:38 AM
。要更进一步,您可以键入?cdate(1.0018287037)
,您将得到一个结果,结果是:1899-12-31 12:02:38 AM
因此,在您的情况下,您可以简单地改变:
MsgBox timeTaken
致:
注意:我没有注意到屏幕截图上写着“Excel”,尽管这个答案应该仍然有效 通常情况下,您会使用计算两个日期之间的差值,但我认为在您的情况下,您会需要其他东西,因为DateDiff不会给您毫秒。相反,只需将对“Now”函数的调用替换为,这只是几秒钟的时间(不过要小心,它只给出从午夜开始经过的时间,因此t2-t1可能是负数,如果您的命令持续几天,您将不会得到任何有意义的结果)。您可以尝试计时器函数。正如其他答案所表明的,可能存在一些警告
Dim startTime As Double, endTime As Double
startTime = Timer
Application.Wait (Now + TimeValue("0:00:10"))
endTime = Timer
msgBox endTime - startTime
非常感谢。所以这就是问题的原因。让我考虑一下这个问题。那个么,小数点后的数字格式(已经过去的一天的数量)是如何工作的呢?如果重新运行我的脚本,将所有内容保持为双倍,我得到的时间(10秒)是0.00005787036934635。这是一天的百分比还是什么?很好的解释。如果还需要毫秒,可以附加.000
以获得ss.000
。看。@ByronWall整洁!我实际上是在寻找类似的东西,但我的go-to网站缺少示例。就我个人而言,我刚刚偷了CTimer代码,用在我的数据库中。哈哈。@timbram我想你可能想为此发布一个新问题。我不完全认为这能放进评论框:-)我讨厌它,我喜欢它!:)我讨厌在VBA中与时间混在一起是一种痛苦!不过,在任何语言中,与时间打交道都可能是一种复杂的野兽!这个方法很有效,对于我当前的进程,我不太担心毫秒,也不会在夜间运行它。
Dim startTime As Double, endTime As Double
startTime = Timer
Application.Wait (Now + TimeValue("0:00:10"))
endTime = Timer
msgBox endTime - startTime