C# Excel VSTO工作簿对象返回空
Excel VSTO附加模块,可在我的功能区中放置一个按钮 我已经指出了问题所在,但我不知道为什么这会给我一个错误,或者如何修复它。更有趣的是,如果我保持在同一个excel实例中,它就可以正常工作。我可以多次运行外接程序,没有问题。现在打开一个新的excel实例,我得到一个COMExceptionC# 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.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对象
以下是与我的问题有关的步骤:
现在,如果我关闭两个实例,并尝试在第二次运行相同的参数,一切正常。我想我现在知道问题出在哪里了。正如前面所说,
\u Application.ActiveWorkbook
在某些情况下可以返回null。因此,当您打开某个弹出窗口时,它会从excel获取焦点,并且不再有活动工作簿。也许,如果你只有一个工作簿,它可以猜测它是激活的唯一选项。但如果您有两个工作簿,它只会返回null。因此,我建议在打开弹出窗口之前,存储一些引用工作簿的变量。。如何打开excel的第二个实例?因为第二个工作簿并不意味着第二个实例。您可以在一个excel进程中打开多个工作簿,或者在多个excel进程中,我再次运行excel.exe,但不能保证它不是同一个进程。你检查过任务管理器了吗?@AlexButenko所以在任务管理器检查后,我只看到一个Excel.exe进程。所以,现在我真的有点困惑,到底发生了什么,这意味着你只有一个例子。excel很正常,它试图将所有内容都放在一个进程中。不清楚如何单独启动,但这是可行的是的,所以我确实这样做了,但很明显,你不会从我发布的内容中知道这一点。但我会尝试另一种方式,你可能给了我一个ideo