Excel VSTO工作簿对象返回空

时间:2016-01-07 17:05:02

标签: c# excel visual-studio vsto

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似乎是一个空对象,因此在其上调用Worksheets[1]会导致错误。

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

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

  1. 打开excel的新实例
  2. 单击功能区中的按钮以执行加载项
  3. 弹出自定义表单,询问用户某些参数
  4. 弹出下一个自定义表单,要求输入更多内容
  5. 单击表格上的确定(从[4]开始),程序的其余部分将执行。
  6. 现在,打开相同的表单,我刚刚运行了VSTO -

    1. 打开excel的新实例
    2. 单击功能区中的按钮以执行加载项
    3. 弹出自定义表单,询问用户某些参数
    4. 弹出下一个自定义表单,要求输入更多内容
    5. 点击确定表单关闭 - 没有任何反应。
    6. 现在,如果我关闭两个实例并尝试运行与第二次相同的参数,一切正常。

1 个答案:

答案 0 :(得分:0)

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