宏失败,'这个宏可能不可用......'

时间:2014-04-01 22:02:35

标签: excel vba excel-vba

您好,并提前感谢您的协助。

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

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

以下是我的宏

的代码
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年。

我想也许问题是因为代码是递归的?

感谢您的建议。

3 个答案:

答案 0 :(得分:14)

进一步发表评论......

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

  

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

我建议您浏览Chip Pearson的链接HERE

如果链接腐烂,请从链接中提取。

  

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

     

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

     

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

     

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

     

类模块用于创建新对象。类模块不是   这里讨论,除了说类模块用于处理   申请活动程序。

答案 1 :(得分:1)

尝试:(我使用此代码)

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

答案 2 :(得分:0)

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

Global tmrTimer1

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