VBA宏计时器作为函数()而不是子() - 丢失第一个变量

Posted

技术标签:

【中文标题】VBA宏计时器作为函数()而不是子() - 丢失第一个变量【英文标题】:VBA Macro timer as a function() instead of a sub() - losing the first variable 【发布时间】:2019-12-29 05:39:00 【问题描述】:

我正在尝试清理一些记录的宏,并想测试我的优化是否真的加快了速度。我想添加一个宏计时器来测试,但理想情况下我会将它添加为一组两个公共函数(),而不是在代码中。

当代码无法调用 time1 变量时,就会出现问题。我认为有一种方法可以将第一次作为常量,但我不确定如何

当我尝试将“dim timer1”更改为“const timer1”时,我收到一个我无法解决的错误。我会以错误的方式解决这个问题吗?我是否需要放弃将其作为函数的想法?

 Sub timertestSub()

    Dim time1 As Double
    Dim time2 As Double
    Dim totaltime As String

    time1 = Timer()

    Application.Wait Now + TimeValue("00:00:10")

    time2 = Timer()

    totaltime = Format((time2 - time1) / 86400, "hh:mm:ss")

    MsgBox "code ran in " & totaltime
    End Sub

Function startTime()

    Dim time1 As Double

    time1 = Timer()

    Debug.Print "time1 is: " & time1

    End Function


Function endTIme()

    Dim time2 As Double
    Dim totaltime As Double

    'confirm orig variable
    Debug.Print "time1 recalled as: " & time1

    time2 = Timer()
    Debug.Print "time2 is: " & time2

    totaltime = (time2 - time1)
    Debug.Print "TotalTime is: " & totaltime

    MsgBox "code ran in " & Format(totaltime / 86400, "hh:mm:ss")

    End Function

Sub timertestFunction()

    Call startTime


    Application.Wait Now + TimeValue("00:00:10")

    Call endTIme

    End Sub

子 timertestSub() 按预期工作,但子 timertestFunction() 丢失了 time1 变量;所以最终的输出就是当前时间

尝试将代码从 dim timer1 as double 变为 const timer1 as double 也会给我错误。

【问题讨论】:

将其定义为Static 变量。 你没有向函数传递任何东西,也没有从你的函数中返回任何东西。 这是个好主意,但它给出了相同的结果。就像静态变量也被第一个函数结束时忘记了 我刚刚运行了您的代码,没有任何问题 - 但是“尝试将代码从 dim timer1 as double 转换为 const timer1 as double”意味着您的原始代码(不是此处提供的代码)中存在拼写错误模块顶部的Option Explicit 将浮出水面。 @chrisneilsen 你能解释一下你的意思吗? 【参考方案1】:

我终于能够通过简单地将所有函数上方的“dim time1 as double”移动为“public time1 as double”来运行代码,这允许函数 endtime 引用它;并且还解决了选项显式错误。最后不是time1值丢失了,而是因为它不是公共变量,所以其他函数/subs无法正确引用它

public time1 as double

Function startTime()

    time1 = Timer()

    Debug.Print "time1 is: " & time1

    End Function


Function endTIme()

    Dim time2 As Double
    Dim totaltime As Double

    'confirm orig variable
    Debug.Print "time1 recalled as: " & time1

    time2 = Timer()
    Debug.Print "time2 is: " & time2

    totaltime = (time2 - time1)
    Debug.Print "TotalTime is: " & totaltime

    MsgBox "code ran in " & Format(totaltime / 86400, "hh:mm:ss")

    End Function

Sub timertestFunction()

    Call startTime


    Application.Wait Now + TimeValue("00:00:10")

    Call endTIme

    End Sub

【讨论】:

以上是关于VBA宏计时器作为函数()而不是子() - 丢失第一个变量的主要内容,如果未能解决你的问题,请参考以下文章

VBA的宏显示“子过程或函数未定义”

从宏调用的函数的 VBA 错误处理

微软访问编辑宏

将 Microsoft Access 作为计划任务运行后退出

VBA将单元格内容分配为公式而不是其结果

在多个子文件夹中搜索文件的 VBA 宏