excel - 打开多个Excel实例时,如何设置Excel实例打开手动打开的文件?

标签 excel vba windows winapi microsoft365

背景:我有一个文件 AppLauncher.xlsm,它在 Excel 的新实例中打开 App.xlsm,然后自行关闭。 App.xlsm 设置 Application.Visible = False,然后显示一个用户窗体。这使用户窗体看起来是它自己的应用程序,与 Excel 无关。
问题:如果用户手动打开另一个文件,该文件将在 Excel 的第二个实例(打开 App.xlsm 的那个)中打开,并使应用程序可见。
目标:当用户手动打开文件时,在已打开的 Excel 实例(如果存在)或新的 Excel 实例中打开文件。
我尝试过/研究过的内容:

  • 使用 Application.WorkbookOpen 事件捕获手动打开的工作簿的路径和名称,然后将其关闭并在不同的 Excel 实例中打开;这会起作用,但它没有考虑到另一个 Workbook.xlsm 的代码使用 Workbook.Open 事件(Workbook.Open 事件在 Application.WorkbookOpen 事件之前触发)。
  • 使用 Access 而不是 Excel。 VBAWarning 注册表项设置为 3,要求所有宏都进行数字签名;不幸的是,Access 中的签名宏似乎被破坏了。
  • 使用 Word 或 PowerPoint。我想我会遇到同样的问题。
  • 运行对象表 (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
    
    App.xlsm 代码:​​
    Private Sub Workbook_Open()
        Application.Visible = False
        UserForm1.Show vbModeless
    End Sub
    
    编辑 1:使用 Application.IgnoreRemoteRequests = True在已打开 App.xlsm 的 Excel 实例上似乎无法在 Microsoft 365 中工作。

    最佳答案

    我认为您可以使用窗口的 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 工作簿仍然隐藏。

    关于excel - 打开多个Excel实例时,如何设置Excel实例打开手动打开的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70596072/

    相关文章:

    excel - VBA 中出现错误并带有消息框

    VBA-替换字符串中的字符

    excel - 获取最后一个数字,直到excel中的特定行

    excel - 条件格式突出显示日期范围

    vba - 记录宏未记录正确的排序代码(与手动记录的结果不同)

    windows - 如何在 Go 中管理 Windows 用户帐户?

    windows - 是否有任何环境变量代表 "C:\Documents and Settings"文件夹或 C :\Users folder in Windows?

    vba - Excel VBA - 将参数传递给属性

    vba - 如果单元格在 vba 中包含特定字符串,如何循环并创建一个新行?

    c - 在 Windows 中获取另一个进程的命令行参数