C# Excel VSTO工作簿对象返回空

C# Excel VSTO工作簿对象返回空,c#,excel,visual-studio,vsto,C#,Excel,Visual Studio,Vsto,Excel VSTO附加模块,可在我的功能区中放置一个按钮 我已经指出了问题所在,但我不知道为什么这会给我一个错误,或者如何修复它。更有趣的是,如果我保持在同一个excel实例中,它就可以正常工作。我可以多次运行外接程序,没有问题。现在打开一个新的excel实例,我得到一个COMException Excel.Workbook thisWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook; //... //Run some code /

Excel VSTO附加模块,可在我的功能区中放置一个按钮

我已经指出了问题所在,但我不知道为什么这会给我一个错误,或者如何修复它。更有趣的是,如果我保持在同一个excel实例中,它就可以正常工作。我可以多次运行外接程序,没有问题。现在打开一个新的excel实例,我得到一个COMException

Excel.Workbook thisWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook;

//...
//Run some code
//Run the below function (my function)

setTheseColumnHeaders(thisWorkbook.Worksheets[1], someList)

//Run some more code

Globals.ThisAddIn.Dispose(); //added this line to see if it would help, but didn't change anything.
第一次运行外接程序时,这不会给我带来任何问题,但现在第二次,
thisWorkbook
似乎是一个空对象,因此对其调用
工作表[1]
会导致错误

不确定发生这种情况的原因-如果我打开一个新的excel实例,并尝试运行加载项,在运行一次后,它应该会创建新对象,但我不知道为什么
Globals.ThisAddIn.Application.ActiveWorkbook
返回一个空的com对象

以下是与我的问题有关的步骤:

  • 打开excel的新实例
  • 单击功能区中的按钮以执行外接程序
  • 自定义表单弹出,询问用户某些参数
  • 下一个自定义表单弹出,要求更多的输入
  • 单击表单上的ok(来自[4]),然后执行程序的其余部分
  • 现在,打开了我刚刚运行VSTO的同一张表-

  • 打开excel的新实例
  • 单击功能区中的按钮以执行外接程序
  • 自定义表单弹出,询问用户某些参数
  • 下一个自定义表单弹出,要求更多的输入
  • 单击“确定”表单关闭-不发生任何事情

  • 现在,如果我关闭两个实例,并尝试在第二次运行相同的参数,一切正常。

    我想我现在知道问题出在哪里了。正如前面所说,
    \u Application.ActiveWorkbook
    在某些情况下可以返回null。因此,当您打开某个弹出窗口时,它会从excel获取焦点,并且不再有活动工作簿。也许,如果你只有一个工作簿,它可以猜测它是激活的唯一选项。但如果您有两个工作簿,它只会返回null。因此,我建议在打开弹出窗口之前,存储一些引用工作簿的变量。。

    如何打开excel的第二个实例?因为第二个工作簿并不意味着第二个实例。您可以在一个excel进程中打开多个工作簿,或者在多个excel进程中,我再次运行excel.exe,但不能保证它不是同一个进程。你检查过任务管理器了吗?@AlexButenko所以在任务管理器检查后,我只看到一个Excel.exe进程。所以,现在我真的有点困惑,到底发生了什么,这意味着你只有一个例子。excel很正常,它试图将所有内容都放在一个进程中。不清楚如何单独启动,但这是可行的是的,所以我确实这样做了,但很明显,你不会从我发布的内容中知道这一点。但我会尝试另一种方式,你可能给了我一个ideo