【问题标题】:Excel macro call does not work from timer, but does from another macroExcel 宏调用不适用于计时器,但适用于另一个宏
【发布时间】:2026-01-12 07:15:01
【问题描述】:

我正在尝试让 excel 每隔 XX 秒运行一次更新。

Sub StartTesting() 
       Call RunAll_ISP   'this call works 
End Sub

Sub macro_timer() 'This sub schedules next run in XX seconds.
    Dim ScanInterval
    ScanInterval = Format(ThisWorkbook.Sheets("Configuration").Range("B5").Value, "hh:mm:ss")
    Application.OnTime Now + TimeValue(ScanInterval), "RunAll_ISP", Schedule:=True  ' !this macro call throws error!
End Sub

如果我运行 Start_testing 宏,调用就可以了。 如果我运行 ma​​cro_timer 宏,它会等待所需的秒数,然后抛出此错误:

无法运行宏“C:\location_of_file\filename.xlsm'!RunAll_ISP'。此工作簿中可能没有该宏或所有宏都可能被禁用

信任中心的宏设置设置为“启用 VBA 宏”

我做错了什么?

【问题讨论】:

  • RunAll_ISP 过程在哪里?它在标准模块中吗?是否声明为Public
  • 所有子都在 ThisWorkbook 中。尝试公开 - 没有任何区别

标签: excel vba timer call


【解决方案1】:

您的问题无法重现。这个简单的示例有效。 因此,由于您的程序 StartTesting 有效,这意味着宏肯定已启用,所以剩下的唯一选择是您的宏 RunAll_ISP 不存在(或命名错误)。

Option Explicit


Public Sub RunAll_ISP()
    MsgBox "I run"
End Sub


Public Sub CreateTimer()
    Application.OnTime Now + TimeValue("00:00:05"), "RunAll_ISP", Schedule:=True
End Sub

【讨论】:

  • 我从空白书开始,将上面的代码添加到其中。但是我得到了完全相同的结果。这是截图:link。顺便说一句,我正在使用 Office 365
  • 这是运行 RunAll_ISP 时的屏幕截图:link
  • @Eki 因为您将代码放入ThisWorkbook 而不是Module!我在第一条评论中问过代码需要插入到标准(非类)模块中。所以添加一个模块并将代码移到那里,它就会工作。
  • 非常感谢!添加模块并在那里有代码确实有效。我需要更多地阅读它。对于任何有同样问题的人,这里是一个屏幕截图应该是什么样子:link