我试图根据文件名打开excel时有条件地启动用户表单。但是,我认为代码在文件完全启动之前就已在运行,这给了我一个错误。
Private Sub Workbook_Open()
Dim name As String
name = ActiveWorkbook.FullName
If InStr(name, "Export Checksheet") > 0 Then
UserForm1.Show
End If
End Sub
在已经打开的文件上进行测试可以很好地运行,但是尝试使其在文件打开时自然运行会导致运行时错误“ 91”,并指向定义name
变量的行。 / p>
答案 0 :(得分:3)
看起来ThisWorkbook
正在加载之前您正在打开的任何其他工作簿,因此ActiveWorkbook
是Nothing
,对其进行任何成员调用都会引发错误91
Workbook_Open
处理程序将仅在ThisWorkbook
(托管VBA项目的文档)上运行-您需要在应用程序级别连接另一个处理程序,以便您可以运行代码只要打开任何工作簿。
更改您的Workbook_Open
处理程序,以将对Application
实例的引用捕获到模块级WithEvents
对象变量中:
Option Explicit
Private WithEvents app As Excel.Application
Private Sub Workbook_Open()
Set app = Me.Application
End Sub
现在从左侧的下拉列表中选择app
,然后为WorkbookOpen
事件创建处理程序-那个是您要验证是否需要弹出该对话框:
Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
If InStr(Wb.FullName, "Export Checksheet") > 0 Then
With New UserForm1
.Show
End With
End If
End Sub
请注意,应用程序范围内的事件为您提供了Workook
对象,因此您不必关心它是否为ActiveWorkbook
。
答案 1 :(得分:2)
这将起作用:
Option Explicit
Private Sub Workbook_Open()
Dim wb As Workbook
For Each wb In Workbooks
If wb.name Like "*Export Checksheet*" Then
wb.Activate
Userform1.Show
End If
Next wb
End Sub
虽然我不明白为什么要这样做,但为什么不只在工作簿“导出”检查表上编写此代码和用户窗体?