打开已保存的工作簿会导致当前工作簿引发exception

我试图打开一个保存Excel工作簿,同时保留对当前工作簿的引用。 问题是,只要我打开保存的工作簿,原始访问时会引发exception。

这是一个代码片段来演示。 我把它放在一个function区button的事件处理程序来testing它。

try { string workbookPath = @"C:\Temp\Test.xlsx"; Workbook current = Globals.ThisAddIn.Application.ActiveWorkbook; Workbook newWorkbook = Globals.ThisAddIn.Application.Workbooks.Open(workbookPath); current.Activate(); // throws an exception Sheets sheets = current.Worksheets; // throws an exception string name = current.Name; // throws an exception } catch (Exception ex) {} 

如果您debugging并将监视放在current sheetsnamevariables上,您可以看到,只要newWorkbook被实例化,其他variables在访问时就抛出exception。

抛出的exception是

 System.Runtime.InteropServices.COMException was caught Message=Exception from HRESULT: 0x800401A8 Source=WorkbookTest ErrorCode=-2147221080 StackTrace: at Microsoft.Office.Interop.Excel._Workbook.Activate() at WorkbookTest.Ribbon1.button1_Click(Object sender, RibbonControlEventArgs e) in C:\Temp\WorkbookTest\WorkbookTest\Ribbon1.cs:line 25 InnerException: 

最奇怪的是, 这只发生在一个新的Excel实例上。 如果我打开Excel,closures第一个工作簿并打开一个新的,它工作得很好。 只有当我有一个新打开的Excel实例,这个失败。 我真的不明白这是为什么。

有谁知道如何解决这一问题? 我在这里做错了什么?

我认为这可能是正确的行为。

如果您要手动启动一个新的Excel会话(自动创build一个新的工作簿[Book1]),然后在没有对Book1执行任何操作的情况下打开一个现有工作簿,您将注意到Excel会话中不再存在Book1。

我猜你正在通过C#加载项体验相同的行为。

这是“creamyegg”描述的正确行为,

如果不使用,Excel将放弃临时工作簿。 为了解决这个问题,你只需要在打开另一个表单之前使用表单。

find一个空单元格并修改它! 您的工作簿将保留,您可以关于您的业务。 🙂