活动用户窗体上的应用程序工作簿打开事件

Application WorkbookOpen Event On Active UserForm

我会试着总结一下。 (Excel 2013)

我创建了一个 Form+VBA 项目,它在您打开文件时执行以下操作:我检查它是否是唯一的工作簿,如果不是,我会提醒用户使用快捷方式我创建的在它自己的实例上打开文件。如果它在它自己的实例上,它会启动一个窗体,它使窗体不可移动,它还会取消 X 按钮。几乎是 "always on top of this instance of excel" 形式。

Private WithEvents App As Application
Private Sub Workbook_Open()
    Set Wb = ThisWorkbook
    If Application.Workbooks.Count > 1 Then
        MsgBox "Please use the shortcut to open this file"
        Application.DisplayAlerts = False
        Wb.Close False
    Else
        Set App = Application
        UserForm1.Show
    End If
End Sub

我添加 triggers/event 当您在同一实例上打开新工作簿或现有工作簿时,它会关闭它们并在单独的实例上打开它们。同样,这是因为表格是 "always on top".

Private Sub App_NewWorkbook(ByVal Wb As Workbook)
    Set cwb = ThisWorkbook
    If Wb.Name <> cwb.Name Then
        Dim exDir As String, opFile As Variant
        Application.DisplayAlerts = False
        Wb.Close False
        exDir = "C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE"
        opFile = Shell("""" & exDir & """ /X", vbNormalFocus)
        Application.DisplayAlerts = True
    End If
End Sub
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    Set cwb = ThisWorkbook
    If Wb.Name <> cwb.Name Then
        Dim fDir, exDir As String, opFile As Variant
        fDir = Wb.Path & "\" & Wb.Name
        Application.DisplayAlerts = False
        Wb.Close False
        exDir = "C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE"
        opFile = Shell("""" & exDir & """ /X """ & fDir & """", vbNormalFocus)
        Application.DisplayAlerts = True
    End If
End Sub

在某种程度上它工作正常。

这里是问题所在:关闭用户窗体时,当您打开新工作簿或现有文件时,两个 triggers/event 都能正常工作,当用户窗体处于活动状态时,只有新工作簿的触发器起作用.如果我尝试打开另一个 excel 文件,它会尝试在现有实例上打开该文件。

好吧,在与它斗争了更多时间之后,我找到了问题所在。当表单处于活动状态并且您想打开现有文件时,excel 根本不会让新文件打开,因此它永远不会触发 WorkbookOpen 事件,因为表单已打开。 NewWorkbook 事件工作正常,因为在 excel 尝试打开 NewWorkbook 时触发。

我解决这个问题的方法是在 UserForm1.Show 命令[=15] 上使用 vbModeless 属性 允许表单和 Excel 之间的交互=].这允许在打开用户窗体时使用 excel window。由于我使表单不可移动、不可关闭,并且我还将 excel 的大小调整为与表单相同的大小,因此这对我有用。现在所有事件都会触发,因为主要 Excel window 可以做任何事情,因此它也会触发 WorkbookOpen 事件。