C# VSTO功能区按钮打开Windows窗体,但如果不关闭窗体C,则无法使用另一个Excel实例

C# VSTO功能区按钮打开Windows窗体,但如果不关闭窗体C,则无法使用另一个Excel实例,c#,excel,vsto,C#,Excel,Vsto,我有一个VSTO应用程序,在功能区上有多个组和按钮。当用户单击按钮时,将在Excel中加载特定表单。看起来,当表单打开时,用户无法打开另一个Excel实例,除非表单在第一个实例中关闭。有没有办法将外接程序从不同的实例中分离出来 我开发了代码,它使用GetVisibility回调来决定是否基于特定工作簿在功能区中显示选项卡。但是,这不允许用户在打开windows窗体时使用多个Excel实例。我一关闭表单,一个新的excel实例就被打开了。VSTO Excel工具是在应用程序级别开发的 MainRi

我有一个VSTO应用程序,在功能区上有多个组和按钮。当用户单击按钮时,将在Excel中加载特定表单。看起来,当表单打开时,用户无法打开另一个Excel实例,除非表单在第一个实例中关闭。有没有办法将外接程序从不同的实例中分离出来

我开发了代码,它使用GetVisibility回调来决定是否基于特定工作簿在功能区中显示选项卡。但是,这不允许用户在打开windows窗体时使用多个Excel实例。我一关闭表单,一个新的excel实例就被打开了。VSTO Excel工具是在应用程序级别开发的

MainRibbon.xml

附加条款


如果在VSTO按钮事件处理程序中打开模式对话框,Excel主线程将被阻止,Excel将不会响应用户输入消息

这还包括尝试打开另一个工作簿。例如,此行为类似于打开“设置单元格格式”对话框

解决方案:

1一种不需要编程的快速解决方法是在尝试打开新工作簿时单击ALT按钮。Excel将显示该消息 要求您打开Excel的新实例

2另一种方法是使用函数而不是ShowDialog在c中打开无模式对话框。这类似于Excel的查找/替换窗口

请查看以下示例以了解更多详细信息以及如何从此类对话框中获得结果。

这些是真正的其他实例,还是这些工作簿窗口在同一实例中打开?我怀疑是后者。Excel和其他Office应用程序在同一应用程序实例中运行多个窗口。在任务管理器中查看列出了多少excel.exe实例。或在Excel的“视图”选项卡下的“窗口”菜单中。抱歉,这些是在同一实例中打开的工作簿窗口!用户是否仍然可以在不受其他工作簿中的Windows窗体影响的情况下打开excel工作簿?如果用户打开了表单,但目前想同时检查另一个工作簿,那么用户在不关闭表单的情况下无法执行此操作?能否提供一段代码片段,说明如何向用户显示表单?
  <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns" label="MDS" insertBeforeMso="TabHome" getVisible="setVisbility" >
        <group id="CreateLoadModel"
               label="Create/Load Model">
          <button id="createmodelbutton" label="Create New Model"
             screentip="Text" onAction="OnCreateModel"
             supertip="Create a new Model"
             imageMso="GroupSmartArtCreateGraphic"/>
        <button id="loadmodelbutton" label="Load Existing Model"
             screentip="Text" onAction="OnLoadModel"
             supertip="Load an Exisitng Model"
             imageMso="FileOpen"/>
        </group>
        public bool setVisbility(Office.IRibbonControl control)
    {
        int nWorkbooks = Globals.ThisAddIn.Application.Workbooks.Count;
        if (nWorkbooks == 0)
        {
            return false;
        }

        if (Globals.ThisAddIn.Application.ActiveWorkbook != null && Globals.ThisAddIn.Application.ActiveWorkbook.Name == "MDS.xlsm")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    private void ThisAddIn_Startup(object sender, EventArgs e)
    {
        this.Application.WorkbookActivate += Application_WorkbookActivate;
        this.Application.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);

    }

    private void Application_WorkbookActivate(Workbook Wb)
    {
        MainRibbon.ribbon.Invalidate();
    }