当打开多个Excel实例时,如何设置手动打开文件在Excel实例中打开?

Str*_*ken 6 windows excel winapi vba microsoft365

背景:我有一个文件 AppLauncher.xlsm,它在 Excel 的新实例中打开 App.xlsm,然后自行关闭。App.xlsm 设置 Application.Visible = False,然后显示用户窗体。这使得用户窗体看起来是它自己的应用程序,与 Excel 无关。

问题:如果用户手动打开另一个文件,该文件将在第二个 Excel 实例(打开 App.xlsm 的实例)中打开,并使应用程序可见。

目标:当用户手动打开文件时,在已打开的 Excel 实例(如果存在)或新的 Excel 实例中打开该文件。

我尝试/研究过的内容:

  1. 使用 Application.WorkbookOpen 事件捕获手动打开的工作簿的路径和名称,然后将其关闭并在不同的 Excel 实例中打开它;这可以工作,但它没有考虑另一个带有使用 Workbook.Open 事件的代码的 Workbook.xlsm(Workbook.Open 事件在 Application.WorkbookOpen 事件之前触发)。
  2. 使用 Access 而不是 Excel。VBAWarning注册表项设置为3,要求所有宏都经过数字签名;不幸的是,Access 中的宏签名似乎已损坏。
  3. 使用 Word 或 PowerPoint。我想我也会遇到同样的问题。
  4. 运行对象表 (ROT)。据我所知,ROT 的目的是在已经有应用程序运行的情况下不创建新的应用程序实例。我还读到 Excel 仅在 ROT 中注册 Excel 的第一个实例;使用RotView,我观察到注册了多个 Excel 实例,而不仅仅是第一个实例。

可能的解决方案:删除打开 App.xlsm 的 Excel 实例的 ROT 条目...不确定如何仅使用 VBA 来完成此操作(使用 SendMessage 函数?)。

AppLauncher.xlsm代码:

Private Sub Workbook_Open()
    Call Shell("excel.exe /x /s " & """" & ThisWorkbook.Path & "\App.xlsm""")
    ThisWorkbook.Close
End Sub
Run Code Online (Sandbox Code Playgroud)

应用程序.xlsm代码:

Private Sub Workbook_Open()
    Application.Visible = False
    UserForm1.Show vbModeless
End Sub
Run Code Online (Sandbox Code Playgroud)

编辑 1:在打开 App.xlsm 的 Excel 实例上使用Application.IgnoreRemoteRequests = True似乎不适用于 Microsoft 365。

Rya*_*dry -1

我认为您可以使用窗口的 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
Run Code Online (Sandbox Code Playgroud)

我能够打开另一个 Excel 工作簿,该新工作簿正常打开,而带有该表单的原始 Excel 工作簿仍然隐藏。