21

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

我究竟做错了什么?

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
4

6 回答 6

53

确保将Private Sub Workbook_Open()子例程粘贴到This Workbook对象中,而不是粘贴到 Module、Form 或 Sheet 对象中。

于 2012-07-08T21:23:15.003 回答
6

有趣的。在 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
于 2014-12-02T13:34:08.187 回答
5

我找到的解决方案是运行以​​下代码,然后“打开”事件起作用。

Sub EventRestore()

    Application.EnableEvents = True

End Sub
于 2017-08-23T12:31:04.287 回答
2

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

于 2016-10-04T03:37:13.843 回答
0

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

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

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

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

与原来的Workbook_1不同,新的Workbook_2在打开时成功运行了Workbook_Open()子。也许这个问题的一个潜在原因与文件的类型历史有关(即,如果它在某些时候是不能运行宏的类型)。或者,也许只是用新文件再次尝试为我解决了这个问题。无论哪种方式,这可能适用于其他解决方案没有的任何人。

于 2019-10-01T15:45:33.683 回答
-1

类似于通过代码解决方案启用Nazim 的事件,我发现了以下修复:

修复

关闭所有 excel 工作簿和 VBA 窗口并重新打开已Workbook_Open()解决的那个。
(可能是由于启用类似于上面链接的 Nazim 解决方案的事件)。

问题经历

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

可能的原因

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

于 2019-01-21T08:50:57.700 回答