Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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-显示子系统运行所需的时间_Vba_Excel - Fatal编程技术网

VBA-显示子系统运行所需的时间

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()

我试图使用以下代码来显示一系列命令运行的时间。在本例中,我希望它返回“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()

        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