繁体   English   中英

Office 2013 c#加载项-空工作簿对象HRESULT:0x800A03EC错误

[英]Office 2013 c# add-in - Null workbook object HRESULT: 0x800A03EC error

使用Visual Studio Enterprise 2015和Office 2013 Pro,我创建了Excel 2013加载项,并且在调试时无法引用Application.Workbook对象! 这是一个最小的示例:

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框架或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.COMException-旧格式或无效的类型库

进一步的搜索显示,这可能是由于Excel和VS代码之间的区域设置不匹配引起的,但是在这种情况下,我检查了区域是否匹配。

编辑2

所以也许我在这里很愚蠢! 进一步的阅读表明,应用程序的.ThisWorkbook属性返回对其中包含代码的工作簿的引用。 由于这是一个外接程序,因此代码包含在.dll中。 因此,我改用.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为您提供了刚刚被激活的确切的Workbook ,然后您运行代码来自己完成工作?

对此要非常小心。

我们的VSTO Excel插件中的ActiveWorkbookThisWorkbook出现了问题,尤其是当用户“做某事”启动我们的VSTO代码时,但是他们打开了其他Excel文件,或者我们的VSTO任务需要一些时间,因此他们切换到另一个工作簿同时。

确保您的代码正在处理正确文件的最佳(唯一方法)是始终使用传递给OnActivate函数的Workbook

private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
{
    //  Do some stuff directly with "workbook" 
    //  
}

至于0x800A03EC错误,这似乎是Excel的通用“这可能意味着任何事情” COM错误之一。

试图找出其中的Excel时,我们也看到了Workbook ,我们应该使用对象。

由于工作簿中未包含外接程序代码,因此未设置Application.ThisWorkbook属性。 Application.ThisWorkbook属性用于返回对包含代码的工作簿的引用,并且不存在这样的工作簿!

为了获得对当前打开的工作簿的引用并导致执行代码,应改用Application.ActiveWorkbook引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM