自动打开子VBA

自动打开子VBA,vba,excel,Vba,Excel,我有一个宏,可以使用:Sub Auto\u Open()在模块中使用脚本自动打开双击Excel工作簿,但在VB编辑器中使用相同的脚本thiswoolk,没有使用:Private Sub workbook\u Open()的模块,该脚本不起作用 知道为什么吗?直接从此工作簿自动打开有什么好处吗?如果可以实现后者,我就不需要任何模块。[Public]Sub Auto_Open()在标准/过程模块中是旧的/传统的方式。除了它的名字外,没有任何东西说“当工作簿第一次打开时,这个过程会自动运行”,它是如何

我有一个宏,可以使用:
Sub Auto\u Open()
在模块中使用脚本自动打开双击Excel工作簿,但在VB编辑器中使用相同的脚本
thiswoolk
,没有使用:
Private Sub workbook\u Open()
的模块,该脚本不起作用


知道为什么吗?直接从
此工作簿自动打开有什么好处吗?如果可以实现后者,我就不需要任何模块。

[Public]Sub Auto_Open()
在标准/过程模块中是旧的/传统的方式。除了它的名字外,没有任何东西说“当工作簿第一次打开时,这个过程会自动运行”,它是如何连接到open上运行的,这有点神奇:一个同名的公共过程在open上运行,谁知道如果在两个单独的模块中有两个这样的过程会发生什么。名称也不是标准的:这里不遵守公认且相当熟悉的
接口成员
约定(两个标识符之间带有下划线):Excel对象模型中没有
自动
对象

Private Sub-Workbook\u Open()
是一个事件处理程序,用于处理
Workbook
接口的
Open
事件,该接口由
thishworkbook
实现;与
Auto\u Open
类似,它在打开工作簿时运行,但其机制更加透明,工作方式与其他事件处理过程完全相同:
workbook
是接口,
Open
是事件/成员

这是一个
工作簿
事件,具有有趣的含义:以编程方式打开(从VBA代码)的工作簿将始终在启用宏的情况下打开-如果该工作簿有一个
工作簿_open
处理程序,然后该宏将运行—但是它是一个实际事件,这意味着您的调用代码可以决定使用
Application.EnableEvents=False
将其关闭

至于它没有运行,我能想到的唯一原因是,如果名称中有输入错误,则禁用宏安全设置。切勿手动键入事件处理程序签名-通过使用“代码”窗格顶部的下拉列表,您可以使VBE为您生成正确的事件处理程序签名

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


“不起作用”是对正在发生的事情的一个相当糟糕的描述。你能把你的帖子扩大一点吗?如果您将
MsgBox
调用放入其中,保存、关闭并重新打开(启用宏),是否获得
MsgBox
?我可以描述的最佳方式。没有消息框。双击Excel图标/文件时,根据MS docs,无法正常工作。宏已启用且为.xlsm文件。请验证宏安全设置,然后在VBE中将光标放在过程中;验证代码窗格顶部的左侧下拉列表是否显示“工作簿”,右侧下拉列表是否显示“打开”。如果左侧的下拉列表显示“(常规)”,则表示方法名称中有输入错误,或者您不在
ThisWorkbook
模块中。您锁定了它。我确实是说将军。谢谢!您可以单击向上/向下投票按钮下方的空心复选标记,将答案标记为“已接受”,从而有效地将您的问题从“未回答”列表中删除。干杯马修。我是否应该使用“右侧打开”下拉列表并在私有子工作簿和“打开”子工作簿和“结束”子工作簿之间应用代码?我在脚本中没有事件处理类型。@hidefguy是的。
Sub
语句创建一个作用域,您可以在其中声明只能从该过程内部访问的局部作用域变量。在VBA中,任何可执行语句都必须在过程范围内。如果在模块顶部声明变量(在声明部分,您将
Option Explicit
),则如果使用
Private
(或
Dim
,但我更喜欢将
Dim
保留为局部变量),则可以在模块内的任何地方访问该变量,在项目中的每个地方都有
Public
(或
Global
,但这已经过时了,而且与
Public
完全相同)。过程声明本身(
Sub
函数
属性
语句)可以(应该)有一个显式的访问修饰符(
公共
私人
朋友
)。如果一个过程没有,默认情况下它是
公共的
。过程和变量一样,应该有尽可能紧密的作用域。过程可以有参数,默认情况下传递
ByRef
,或者
ByVal
,如果这样指定;
函数
属性Get
访问器可以(应该)还有一个返回类型。通过将参数传递给其他过程,您可以轻松减少/消除对全局变量的需要。请不要像这样诋毁您的问题…这不是一个讨论论坛,而是问答-如果您有一个新问题,问一个新问题!;-)…并确保包含实际代码,而不是它的屏幕截图。也就是说,
Windows
集合中似乎没有名为“LSE”的窗口。为什么您认为需要使用单个窗口?声明
工作簿
对象
Dim wbLSE As Workbook
然后
Set wbLSE=Workbooks.Open(…)
-工作簿
Workbooks.Open
方法是一个函数,它返回它打开的工作簿的对象引用:使用它!