Office 2013 c#加载项-空工作簿对象HRESULT:0x800A03EC错误
使用Visual Studio Enterprise 2015和office 2013 pro,我创建了一个Excel 2013加载项,调试它时,我无法引用应用程序。工作簿对象!下面是一个简单的例子:Office 2013 c#加载项-空工作簿对象HRESULT:0x800A03EC错误,c#,.net,excel,ms-office,office-interop,C#,.net,Excel,Ms Office,Office Interop,使用Visual Studio Enterprise 2015和office 2013 pro,我创建了一个Excel 2013加载项,调试它时,我无法引用应用程序。工作簿对象!下面是一个简单的例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using Excel = Microsoft.Office.Interop.E
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;
namespace ExcelAddIn1
{
public partial class ThisAddIn
{
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
var app = Globals.ThisAddIn.Application;
var wb = app.ThisWorkbook;
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
在尝试分配wb时,我收到错误:
“ExcelAddIn1.dll中发生类型为“System.Runtime.InteropServices.COMException”的异常,但未在用户代码中处理”
在检查(快速观察)应用程序对象时,许多属性具有以下值:
{System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.Runtime.InteropServices.COMException:旧格式或无效的类型库。(来自HRESULT的异常:0x80028018(type_E_INVDATAREAD))”
除其他问题外,应用程序对象似乎没有工作簿。
我确信代码是正确的,但我的.Net framework或office版本或构建设置可能有问题?
有人能解释一下吗
**编辑1**
因此,根据Richard Morgan的建议,我尝试了以下方法,在看到原始代码运行时可能没有活动工作簿:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;
namespace ExcelAddIn1
{
public partial class ThisAddIn
{
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(WorkWithWorkbook);
}
private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
{
// Workbook has been opened. Do stuff here.
var app = Globals.ThisAddIn.Application;
Excel.Workbook wb = app.ThisWorkbook;
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
因此,在执行WorkWithWorkbook()时,我希望有一个ActiveWorkbook可以获得引用。不幸的是,我仍然得到COMException,其中包含:
“来自HRESULT:0x800A03EC的异常”
对应用程序对象的进一步检查显示工作簿集合已部分填充,但许多属性仍引用:
System.Runtime.InteropServices.ComeException-旧格式或无效的类型库
进一步的搜索表明,这可能是由于Excel和VS代码之间的区域设置不匹配造成的,但我已经检查了在这种情况下区域是否匹配
编辑2
因此,也许我在这里太傻了!进一步阅读表明,应用程序的.ThisWorkbook属性返回对包含代码的工作簿的引用。由于这是一个外接程序,代码包含在.dll中。因此,我使用了.ActiveWorkbook,它返回了一个引用而不引发异常!,因为该外接程序-在工作簿中不包含代码的情况下,
应用程序。未设置ThisWorkbook
属性。应用程序。ThisWorkbook
属性用于返回对包含代码的工作簿的引用,但不存在此类工作簿
为了获取对当前打开的工作簿的引用并执行代码,应改用应用程序.ActiveWorkbook
引用。这是奇怪的代码:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(WorkWithWorkbook);
}
private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
{
// Workbook has been opened. Do stuff here.
var app = Globals.ThisAddIn.Application;
Excel.Workbook wb = app.ThisWorkbook;
}
那么,Excel为您提供了刚刚激活的准确的工作簿
,然后您自己运行代码来解决它
对此要非常小心
我们的VSTO Excel加载项中的ActiveWorkbook
和ThisWorkbook
存在问题,特别是当用户“做点什么”启动我们的VSTO代码时,但他们打开了其他Excel文件,或者我们的VSTO任务需要一些时间,同时他们切换到另一个工作簿
确保代码处理正确文件的最佳(唯一?)方法是始终使用工作簿
,该工作簿将传递给OnActivate
函数
private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
{
// Do some stuff directly with "workbook"
//
}
至于0x800A03EC错误,它似乎是Excel的通用“这可能意味着任何东西”COM错误之一
当我们试图确定应该使用哪个Excel
工作簿
对象时,我们也看到了这一点。您是否确实有一个指向Microsoft.Office.Interop的引用集?如果有,可以使用Excel.工作簿
而不是var
谢谢xxbbcc这现在是一个mcvethanks宏,但明确说明了类型这个答案有用吗?是的,这很奇怪,但对于这个例子,我刚刚选择了我在列表中看到的第一个事件,它保证工作簿处于活动状态!