自动打开子VBA

时间:2018-07-12 01:51:35

标签: vba excel-vba

我有一个宏,该宏使用以下命令自动打开双击的Excel工作簿:Sub Auto_Open()在模块中具有脚本,但是在VB编辑器ThisWorkbook中,相同的脚本在没有模块的情况下使用:Private Sub Workbook_Open()不会不行。

为什么有任何想法?直接从ThisWorkbook自动打开有什么优势?如果后者可以实现,我不需要任何模块。

1 个答案:

答案 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为您生成正确的事件处理程序签名。

当左侧下拉列表包含对象/接口的名称,而右侧下拉列表包含事件/成员的名称时,您知道您正在查看事件处理程序。

Workbook_Open: "Workbook" on the left, "Open" on the right

WorkbookOpen: "(General)" on the left, "WorkbookOpen" on the right