活动用户窗体上的应用程序工作簿打开事件
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 事件。
我会试着总结一下。 (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 事件。