如何在启动时检索文件名

时间:2019-06-19 15:00:24

标签: excel vba

我试图根据文件名打开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>

2 个答案:

答案 0 :(得分:3)

看起来ThisWorkbook正在加载之前您正在打开的任何其他工作簿,因此ActiveWorkbookNothing,对其进行任何成员调用都会引发错误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

虽然我不明白为什么要这样做,但为什么不只在工作簿“导出”检查表上编写此代码和用户窗体?