我将尝试总结一下。 (Excel 2013)
我创建了一个Form + VBA项目,在打开文件时执行以下操作:我检查它是否是唯一的工作簿,如果不是,那么我提醒用户使用我创建的打开的快捷方式该文件在自己的实例上。如果它在它自己的实例上,它启动一个Form,它使表单不可移动,它也取消X按钮。几乎总是在这个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
我添加了触发器/事件,当您在同一个实例上打开新工作簿或现有工作簿时,它会关闭它们并在单独的实例上打开它们。再次,这是因为表格始终位于顶部"。
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
它可以正常工作。
问题出现了:当UserForm关闭时,当打开新工作簿或现有文件时,两个触发器/事件都可以正常工作,当UserForm处于活动状态时,只有新工作簿的触发器有效。如果我尝试打开另一个excel文件,它会尝试在现有实例上打开该文件。
答案 0 :(得分:0)
在与它战斗了很长时间后,我发现了问题。当表单处于活动状态并且您想要打开现有文件时,excel根本不会让新文件打开,因此它永远不会触发WorkbookOpen事件,因为表单是打开的。 NewWorkbook事件工作正常,因为当excel尝试打开NewWorkbook时会触发。
我解决这个问题的方法是使用UserForm1.Show命令上的 vbModeless属性允许Form和Excel之间的交互。这允许在打开UserForm的同时使用excel窗口。由于我使表单不可移动,不可关闭,我也将excel调整为与表单相同的大小,这对我有用。现在所有的evens都会触发,因为主Excel窗口可以执行所有操作,因此它也会触发WorkbookOpen事件。