我要试着总结一下。(Excel 2013)
我已经创建了一个Form+VBA项目,它在打开文件时执行以下操作:我检查它是否是唯一的工作簿,如果不是,我会提醒用户使用我创建的快捷方式打开它自己的实例上的文件。如果它是在它自己的实例,它启动一个表单,它使表单不可移动,它还取消了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文件,它将尝试在现有实例上打开该文件。
发布于 2018-04-20 15:48:25
嗯,在与它斗争了更多的时间后,我发现了问题。当表单处于活动状态并希望打开现有文件时,excel根本不允许新文件打开,因此它不会触发WorkbookOpen事件,因为表单是打开的。NewWorkbook事件工作正常,因为在excel试图打开NewWorkbook时触发。
修复这个问题的方法是使用UserForm1.Show命令vbModeless属性允许表单和之间的交互。这允许在打开UserForm时使用excel窗口。由于我使表单不可移动,不可关闭,我也调整了excel的大小与表单相同的大小,这对我来说是有效的。现在所有的事件都会触发,因为主Excel窗口可以完成所有操作,因此它也会触发WorkbookOpen事件。
https://stackoverflow.com/questions/49932030
复制相似问题