【问题标题】:VBA - Displaying how long a sub took to runVBA - 显示子程序运行多长时间
【发布时间】:2015-09-29 09:46:11
【问题描述】:

我正在尝试使用以下代码来显示一系列命令的运行时间。在这个例子中,我预计它会返回“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

结果:

砰!问题解决了!感谢大家的帮助!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    日期在 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 点。

    您可以通过返回您的即时窗口并输入?cdate(0.0018287037) 直观地看到这一点,您将获得如下结果:12:02:38 AM。更进一步,你可以输入?cdate(1.0018287037),你会得到一个结果:1899-12-31 12:02:38 AM

    所以在你的情况下,你可以简单地改变:

    MsgBox timeTaken
    

    收件人:

    MsgBox Format(timeTaken, "nn:ss")
    

    注意:我没有注意到屏幕截图中显示“Excel”,尽管这个答案应该仍然有效。

    【讨论】:

    • 谢谢。所以这绝对解释了这个问题。让我考虑一下。
    • 那么,小数点后的数字(当天过去的数量)的格式如何工作?如果重新运行我的脚本,将所有内容都加倍,我会发现经过的时间(10 秒)是 0.00005787036934635。这是一天的百分比还是什么?
    • 扎实的解释。如果你也想要毫秒,你可以附加.000 来得到ss.000。见stackoverflow.com/questions/3095407/…
    • @ByronWall 整洁!我实际上正在寻找类似的东西,但我的首选reference 网站缺少示例。就我个人而言,我只是从here 中窃取了 CTimer 代码,以便在我的数据库中使用哈哈。
    • @timbram 我认为您可能想为此发布一个新问题。我不完全认为这适合评论框:-)
    【解决方案2】:

    通常你会使用DateDiff function 来计算两个日期之间的差异,但我认为在你的情况下你会想要别的东西,因为 DateDiff 不会给你毫秒。相反,只需将您对“Now”函数的调用替换为 Timer(),这只是几秒钟(但请注意,它只给您从午夜开始经过的时间,所以 t2 - t1 可以是负数,如果您的命令持续几天你不会得到任何有意义的结果)。

    【讨论】:

      【解决方案3】:

      你可以试试定时器功能。正如其他答案所示,可能有一些警告。

      Dim startTime As Double, endTime As Double
      startTime = Timer
      
      Application.Wait (Now + TimeValue("0:00:10"))
      
      endTime = Timer
      msgBox endTime - startTime
      

      【讨论】:

      • 我讨厌它,我喜欢它! :) 我讨厌搞乱时间是 VBA 的一大痛苦!尽管如此,在任何语言中处理时间都可能是一头复杂的野兽!这种方法有效,对于我当前的过程,我不太担心毫秒,也不会在晚上运行它或任何东西。
      猜你喜欢
      • 2018-04-07
      • 2011-05-30
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多