【问题标题】:Macro Fails, 'The macro may not be available in this...'宏失败,“此宏可能不可用...”
【发布时间】:2014-05-12 22:18:01
【问题描述】:

您好,提前感谢您的帮助。

我有一些我承认从网站借来的代码。它每 X 秒更改一次显示的工作表。在我的情况下 3 秒。当我运行它时,它会一次更改到下一张,然后在 3 秒后出错。

我收到的错误是“无法运行宏”C:\users\BenjaminSmith\Desktop\Book1.xlsm'!displaysheets'。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。"

这是我的宏的代码

Sub displaysheets()

ShtNum = ActiveSheet.Index

ShtNum = ShtNum + 1
If ShtNum > Sheets.Count Then
ShtNum = 1
End If
Sheets(ShtNum).Activate
Application.OnTime Now + TimeValue("00:00:03"), "displaysheets"


End Sub

如果我删除该行

Application.OnTime Now + TimeValue("00:00:03"), "displaysheets"

我可以一遍又一遍地运行宏,没有任何问题。除了它不会自行继续的事实之外......

电子表格是 XLSM。 MS VBA 是 7.0。 Excel 是 2010。

我在想问题可能是因为代码是递归的?

感谢您的建议。

【问题讨论】:

  • 它对我有用。希望您已将displaysheets 放入模块中?
  • 您的代码也适用于我。但我会将工作表激活部分简化为Sheets(ActiveSheet.Index Mod Sheets.Count + 1).Activate。你可以试试Application.OnTime Now + TimeValue("00:00:03"), ThisWorkbook.Name & "!displaysheets"
  • @Siddharth Rout 我在“ThisWorkbook”中有代码,我插入了一个模块“Module1”并将代码移到那里,一切都按预期工作。这两个地方有什么区别?
  • 查看我发布的答案:)

标签: vba excel


【解决方案1】:

从 cmets 进一步...

代码不起作用,因为您没有将代码粘贴到模块中。这是新程序员中非常常见的错误。在这种情况下,Excel 在搜索模块时无法找到代码。

@Siddharth Rout 我在“ThisWorkbook”中有代码,我插入了一个模块“Module1”并将代码移到那里,一切都按预期工作。这两个地方有什么区别?

我建议通过 Chip Pearson 的链接 HERE

如果链接失效,请从链接中提取。

标准代码模块,也简称为代码模块或简称 模块是您放置大部分 VBA 代码的地方。你的基本宏 并且您的自定义函数(用户定义函数)应该在这些 模块。对于新手程序员,您的所有代码都将是标准的 模块。除了你的基本程序,代码模块 应包含对外部函数的任何 Declare 语句(Windows API 或其他 DLL),以及使用类型定义的自定义数据结构 陈述。

您的工作簿的 VBA 项目可以包含尽可能多的标准代码模块 如你所愿。这使您可以轻松地将您的程序拆分为 用于组织和易于维护的不同模块。为了 例如,您可以将所有数据库过程放在一个名为 数据库,以及您在另一个模块中的所有数学程序 称为数学。只要过程没有用 Private 声明 关键字,或者模块未标记为私有,您可以调用任何 任何其他模块中的任何模块中的过程,而无需执行任何操作 特别的。

工作簿和工作表模块是直接绑定到 Workbook 对象和每个 Sheet 对象。该模块为 工作簿称为ThisWorkbook,每个Sheet模块都有相同的 命名为它所属的工作表。这些模块应该包含 对象的事件过程,仅此而已。如果你把 标准代码模块中的事件过程,Excel 不会找到它们,所以 他们不会被处决。如果你把普通程序放在一个 工作簿或工作表模块,您将无法完全调用它们 限定参考。

用户表单模块是用户表单对象的一部分,包含 该表单上的控件的事件过程。例如, 用户窗体上的命令按钮的单击事件存储在 UserForm 的代码模块。像工作簿和工作表模块一样,您应该 在这个模块中只放置 UserForm 控件的事件过程。

类模块用于创建新对象。类模块不是 这里讨论,只是说一个类模块是用来处理 应用程序事件过程。

【讨论】:

  • 我的答案是按照解释将代码移动到模块中。计时器代码导致弹出错误对话框,直到我将它从工作表移到模块中。
  • +1 Siddharth - 尽管我已经编写 VBA 多年,但我不知道 Application.OnTime 调用需要在模块中。太糟糕了,这个答案是我读到的第 10 个 SO 答案!
【解决方案2】:

尝试:(我使用此代码)

With Application
    .EnableEvents = True 'needed
    .OnTime EarliestTime:=Now + TimeSerial(0, 0, 3), Procedure:="displaysheets", Schedule:=True
End With

【讨论】:

    【解决方案3】:

    尝试将你的计时器放在一个全局变量中,并在每次运行该函数时添加它,还将 OnTime 配置为可调度

    Global tmrTimer1
    
    Sub displaysheets()
         tmrTimer1 = Now + TimeValue("00:00:03")
         'Enable the schedule
         Application.OnTime tmrTimer1 , "displaysheets", , True
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多