excel 如何使用OnTime刷新选择?错误:无法运行宏

kknvjkwl  于 2023-03-04  发布在  其他
关注(0)|答案(3)|浏览(269)

第一次运行宏时,单元格将刷新

Sub RefreshAction()
    Range("b7").Select
    Application.Run "RefreshCurrentSelection"
    Application.OnTime (Now() + TimeValue("00:00:05")), "thisworkbook.Action"
End Sub

之后我立即收到错误消息
无法运行宏“C\Desktop\XYZ. xlsm '!thisworkbook. Action”。该宏可能在此工作簿中不可用,或者所有宏都被禁用。
我已经完成了“信任中心-〉信任中心设置-〉宏设置-〉启用所有宏”。
同时单击“信任对VBA工程对象模型的访问”框。

xwbd5t1u

xwbd5t1u1#

首先,下面是当您试图从工作表(而不是模块)运行OnTime时所得到的错误的快照,我将对此进行解释。我也得到了这个错误,并试图找出原因。

它看起来像是一个安全错误,但在本例中,它并不完全是一个正常的安全错误。
要在计时器上运行代码,必须将其添加到VBA模块中。转到VisualBasic编辑器并右键单击VBAproject(工作簿)。在Excel中,它如下所示:


添加模块后,您可以在其中添加计时器代码。
由于您希望每5秒调用一次RefreshAction,因此应执行如下操作:

Sub StartProcess()
    Debug.Print Now()
    Application.OnTime Now() + TimeValue("00:00:05"), "RefreshAction", Schedule = True
End Sub

Sub RefreshAction()
    Application.EnableEvents = True
    Debug.Print Now() + TimeValue("00:00:05")
    Application.OnTime Now() + TimeValue("00:00:05"), "RefreshAction", Schedule = True
End Sub

我将允许您在RefreshAction子例程中添加您希望它每次执行的代码。
下面是它在模块中的样子。确保你的显示与图片中一样,它在模块中:

另外,我发现它很不可靠。如果你在OnTime调用中有任何哪怕是轻微的错误,它都会默默地失败。复制我的代码(我测试过它)并先尝试一下。一旦它运行,只需将你的代码添加到RefreshAction子程序中。

启动进程()

运行StartProcess以启动该进程。

还有奇怪的事

在我添加了模块之后,我的代码仍然在工作表中,我返回并尝试运行它,再次看到错误,奇怪的是,一旦代码在模块中,你就不会再从工作表中得到错误了。它现在可能引用了模块中的代码。

wribegjk

wribegjk2#

有关更多详细信息,请参见绝对参考:CPearson OnTime

第一个问题,您需要存储将在OnTime方法中输入的时间,以便能够停止它。(这里我声明了一个 Public TimeToRun As Date
第二点要连续使用OnTime方法,您需要在定时程序结束时重置定时器(此处为RefreshAllStaticData)。

因此,整个代码应该如下所示:

Public TimeToRun As Date 'so that TimeToRun can be used in both the functions

Sub RefreshAction()
    Range("b7").Select
    Application.Run "RefreshCurrentSelection"
    DoEvents
    'Store the next date of execution in TimeToRun
    TimeToRun = Now() + TimeValue("00:00:05")
    'Launch the next OnTime
    Application.OnTime TimeToRun, "RefreshAllStaticData"
End Sub

Sub RefreshAllStaticData()

'--++-- Place your code here, as it is now --++--

'----Call RefreshAction to reset the OnTime method
'---------to another 5 seconds and keep "looping"
RefreshAction

End Sub

Sub Kill_OnTime()
'Launch this to stop the OnTime method
Application.OnTime _
    earliesttime:=TimeToRun, _
    procedure:="RefreshAllStaticData", _
    schedule:=False
End Sub
hs1rzwqc

hs1rzwqc3#

这个错误的另一个相关原因可能是OnTime方法的Procedure参数的字符串长度限制。在vba函数中绕过最大字符串大小?

相关问题