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