**背景:**我有一个文件AppLauncher.xlsm,它在Excel的新示例中打开App.xlsm,然后自行关闭。App.xlsm设置Application.Visible = False,然后显示一个用户窗体。这使用户窗体看起来是它自己的应用程序,与Excel无关。
**问题:**如果用户手动打开另一个文件,该文件将在第二个Excel示例(打开了App.xlsm的示例)中打开,并使应用程序可见。
**目标:**当用户手动打开文件时,在已打开的Excel示例(如果存在)或新的Excel示例中打开文件。
我尝试/研究的内容:
1.使用Application.WorkbookOpen事件捕获手动打开的工作簿的路径和名称,然后将其关闭并在其他Excel示例中打开;这是可行的,但是它没有考虑到另一个Workbook.xlsm,它的代码使用Workbook.Open事件(Workbook.Open事件在Application.WorkbookOpen事件之前触发)。
1.使用Access而不是Excel。VBAWarning注册表项设置为3,要求对所有宏进行数字签名;不幸的是,Access中的签名宏似乎被破坏了。
1.使用Word或PowerPoint。我想我也会遇到同样的问题。
1.运行对象表(Running Object Table,ROT):据我所知,ROT的目的是在已经有应用程序在运行时不创建新的示例,我还知道Excel只在ROT中注册Excel的第一个示例;使用RotView时,我观察到注册了Excel的多个示例,而不仅仅是第一个示例。
**可能的解决方案:**删除打开了App.xlsm的Excel示例的ROT条目...不确定如何仅使用VBA完成此操作(使用SendMessage函数?)。
应用启动器.xlsm代码:
Private Sub Workbook_Open()
Call Shell("excel.exe /x /s " & """" & ThisWorkbook.Path & "\App.xlsm""")
ThisWorkbook.Close
End Sub
应用程序.xlsm代码:
Private Sub Workbook_Open()
Application.Visible = False
UserForm1.Show vbModeless
End Sub
**编辑1:**在打开了App.xlsm的Excel示例上使用Application.IgnoreRemoteRequests = True
似乎无法在Microsoft 365中工作。
2条答案
按热度按时间m2xkgtsf1#
我认为你可以使用窗口的API来显示或隐藏应用程序示例。
这里有一些代码,我想类似这样的东西是你所追求的。
我能够打开另一个Excel工作簿,新的工作簿正常打开,而原来的Excel工作簿与窗体仍然隐藏。
kgsdhlau2#
我的解决方案是使用一个批处理文件。批处理脚本首先打开一个命名的excel文件。然后使用/x打开excel应用程序文件,在一个新的会话中打开它。双击另一个excel文件,在第一个注册的会话中打开它。不去管excel应用程序。只要用户不关闭第一个excel文件,这是可以的。我承认这在Win10和Excel 2010中运行得很好,但我发现它在Win 11和Excel 365中有点不稳定。