windows 打开多个Excel示例时,如何设置打开手动打开文件的Excel示例?

9ceoxa92  于 2023-01-18  发布在  Windows
关注(0)|答案(2)|浏览(218)

**背景:**我有一个文件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中工作。

m2xkgtsf

m2xkgtsf1#

我认为你可以使用窗口的API来显示或隐藏应用程序示例。
这里有一些代码,我想类似这样的东西是你所追求的。

Option Explicit

Public Declare Function ShowWindow Lib "user32.dll" (ByVal HWND As Long, ByVal nCmdShow As Long) As Long

Public Const SW_HIDE As Long = 0
Public Const SW_SHOW As Long = 5

Public Sub ShowHide()
    ShowWindow ThisWorkbook.Application.HWND, SW_HIDE 'Get the Handle of the application running the form
    UserForm1.Show 'Pop the form open
    ShowWindow ThisWorkbook.Application.HWND, SW_SHOW 'When the form closes, show Excel again
End Sub

我能够打开另一个Excel工作簿,新的工作簿正常打开,而原来的Excel工作簿与窗体仍然隐藏。

kgsdhlau

kgsdhlau2#

我的解决方案是使用一个批处理文件。批处理脚本首先打开一个命名的excel文件。然后使用/x打开excel应用程序文件,在一个新的会话中打开它。双击另一个excel文件,在第一个注册的会话中打开它。不去管excel应用程序。只要用户不关闭第一个excel文件,这是可以的。我承认这在Win10和Excel 2010中运行得很好,但我发现它在Win 11和Excel 365中有点不稳定。

相关问题