打开工作簿时,Workbook_Open sub不会运行?

时间:2012-07-06 21:18:01

标签: excel vba excel-vba

该程序应该创建一个按钮,用户可以按下该按钮来激活不同的子按钮。从我的在线搜索中,似乎下面的子应该在打开工作簿时激活,但它不是?

我做错了什么?

Option Explicit
Private Sub Workbook_Open()
Dim btn As Button
Dim rng As Range
With Worksheets("Sheet1")
    Set rng = .Range("B2:C2")
        Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    With btn
        .Caption = "To begin the program, please click this button"
        .AutoSize = True
        .OnAction = "TableCreation1"
    End With
End With
End Sub

6 个答案:

答案 0 :(得分:35)

确保 Private Sub Workbook_Open()子例程粘贴在此工作簿对象内,而不是模块,表单或工作表对象中。

答案 1 :(得分:5)

有趣。 在2009年,描述了与要打开的工作表的条件格式的冲突,如 vbforum post

似乎这个错误仍然存​​在于excel中并阻止workbook_open事件被触发。 我有一个工作簿(旧的XLS二进制格式),它不会在Excel 2003和2007中触发事件,但是在2013年。我从第一个工作表中删除了所有条件格式,但仍然无法获得workbook_open过程在较旧的Excel版本中运行。

解决方法,我在分布式工作簿中使用的是在工作簿中使用局部变量和第二个事件,如下所示:

''
' private variable
Private wbOpenEventRun as Boolean

''
' procedure to be called by excel when workbook opens
Private Sub Workbook_Open()
    wbOpenEventRun = true
    ' perform tasks
End Sub

''
' the selection change event fires usually.
' performance is not reduced
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Not wbOpenEventRun Then Workbook_Open
    ' perform tasks in reaction of selection change events, if required
End Sub

答案 2 :(得分:2)

我知道这篇文章已经休眠了一段时间,但我只是花了好几个小时来解决这个问题。这是最奇怪的事情,但我终于注意到我的一个工作表是在“页面视图”中......一旦我将其置于“正常”状态,我的Workbook_Open()函数就开始正常工作了。非常奇怪 - 绝对是一个Excel错误...很高兴我终于解决了它...希望它能帮到某个人......

答案 3 :(得分:2)

我找到的解决方案是运行以​​下代码,然后是" Open"事件有效。

Sub EventRestore()

    Application.EnableEvents = True

End Sub

答案 4 :(得分:0)

类似于Nazim's event enable via code solution,我发现了以下解决方法:

修复

关闭所有excel工作簿和VBA窗口,然后使用Workbook_Open() 重新打开它。
(可能是由于该事件启用了类似于上面链接的Nazim解决方案)。

问题经验

在调试和中止执行时,我在中止之前禁用了正在运行的代码中的事件。起初我没有注意到这种情况,甚至在我的工作簿关闭/重新打开后也没有用...

可能的原因

...其他打开的excel工作簿或某个全局实例以某种方式“记住”重新打开的工作簿的事件已关闭。

答案 5 :(得分:0)

我的解决方案有点晦涩难懂,现在我什至不记得为什么我认为它是一种潜在的解决方案。我最初通过以下步骤创建的文件,其中创建了其中的Workbook_Open()宏将无法运行的文件:

  1. 右键单击相关文件夹,单击新建,再单击 Microsoft Excel工作表
  2. 将文件命名为“ Workbook_1 ”。
  3. 打开了 Workbook_1
  4. 文件另存为,将文件类型更改为启用Excel宏的工作簿(* .xlsm),保存。
  5. 编写了VBA代码,包括嵌套在 ThisWorkbook 中的 Workbook_Open()

无论出于何种原因,我都想知道我的问题是否与文件“开始为”标准 .xlsx 有关。所以我简单地:

  1. 在Excel( Book1 )中打开一个新的空白工作簿。
  2. 文件,另存为,输入 Workbook_2 ,将文件类型更改为启用Excel宏的工作簿(* .xlsm),保存。
  3. 从原始的 Workbook_1 复制了VBA代码和结构。

与原始的 Workbook_1 不同,新的 Workbook_2 在打开时成功运行了 Workbook_Open()子项。可能导致此问题的原因与文件的类型历史记录有关(即,如果它在某个时候不能运行宏)。或者,也许只是简单地尝试使用一个新文件为我解决了这个问题。无论哪种方式,这对于没有其他解决方案的人来说都是可行的。