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对象。

以下是我的问题涉及的步骤:

  1. 打开excel的新实例
  2. 单击功能区中的按钮以执行加载项
  3. 弹出自定义表单,要求用户输入某些参数
  4. 下一个自定义表单弹出,要求更多输入
  5. 单击表单上的ok(来自[4]),程序的其余部分就会执行

现在,打开了我刚刚为-运行VSTO的同一张纸

  1. 打开excel的新实例
  2. 单击功能区中的按钮以执行加载项
  3. 弹出自定义表单,要求用户输入某些参数
  4. 下一个自定义表单弹出,要求更多输入
  5. 单击"确定"表单关闭-什么都不发生

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

Excel VSTO工作簿对象返回空

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