Excel VSTO工作簿对象返回空
本文关键字:返回 对象 工作簿 VSTO Excel | 更新日期: 2023-09-27 18:29:19
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
似乎是一个null对象,因此对其调用Worksheets[1]
会导致错误。
不知道为什么会发生这种情况——如果我打开一个excel的新实例,并尝试运行外接程序,在运行一次后,它应该会创建新的对象,但我不知道为什么Globals.ThisAddIn.Application.ActiveWorkbook
会返回一个空的com对象。
以下是我的问题涉及的步骤:
- 打开excel的新实例
- 单击功能区中的按钮以执行加载项
- 弹出自定义表单,要求用户输入某些参数
- 下一个自定义表单弹出,要求更多输入
- 单击表单上的ok(来自[4]),程序的其余部分就会执行
现在,打开了我刚刚为-运行VSTO的同一张纸
- 打开excel的新实例
- 单击功能区中的按钮以执行加载项
- 弹出自定义表单,要求用户输入某些参数
- 下一个自定义表单弹出,要求更多输入
- 单击"确定"表单关闭-什么都不发生
现在,如果我关闭两个实例,并尝试在第二次运行相同的参数,一切都会很好。
我想我现在知道问题出在哪里了。正如文档所说,_Application.ActiveWorkbook
在某些情况下可能返回null。所以,当你打开一些弹出窗口时,它会从excel中获取焦点,并且不再有活动工作簿。也许,如果你只有一个工作簿,它可以猜测它是唯一的活动选项。但如果你有两个工作簿,它只会返回null。因此,我建议在打开弹出窗口之前,存储一些变量并引用您的工作簿。