我有一个宏,该宏使用以下命令自动打开双击的Excel工作簿:Sub Auto_Open()
在模块中具有脚本,但是在VB编辑器ThisWorkbook
中,相同的脚本在没有模块的情况下使用:Private Sub Workbook_Open()
不会不行。
为什么有任何想法?直接从ThisWorkbook
自动打开有什么优势?如果后者可以实现,我不需要任何模块。
答案 0 :(得分:1)
[Public] Sub Auto_Open()
是旧的/旧的方式。除了其名称外,没有什么可以说“该过程在首次打开工作簿时自动运行”,如何将其连接起来以在Open上运行是一种魔力:同名的公共过程在open上运行,谁知道如果您拥有两个不同模块中的两个这样的过程。该名称也不是标准的:这里没有遵循公认的且相当熟悉的Interface_Member
约定(两个标识符之间带有下划线):Excel对象模型中没有Auto
对象。
Private Sub Workbook_Open()
是一个事件处理程序过程,用于处理Open
实现的Workbook
接口的ThisWorkbook
事件;像Auto_Open
一样,它在打开工作簿时运行,但是其机制更加透明,并且与其他所有事件处理过程完全一样:Workbook
是接口,Open
是接口活动/成员。
这是一个Workbook
事件,它具有有趣的含义:(通过VBA代码)以编程方式打开的工作簿将始终在启用宏的情况下打开-如果该工作簿具有Workbook_Open
处理程序,则该宏将运行-但是这是一个实际事件,这意味着您的调用代码可以决定使用Application.EnableEvents = False
将其关闭。
至于它没有运行,禁止宏安全设置,我唯一想到的原因是名称中是否有错字。永远不要手动键入事件处理程序签名-通过使用代码窗格顶部的下拉菜单,您可以使VBE为您生成正确的事件处理程序签名。
当左侧下拉列表包含对象/接口的名称,而右侧下拉列表包含事件/成员的名称时,您知道您正在查看事件处理程序。