2015-09-29 53 views
1

使用Visual Studio Enterprise 2015和office 2013 pro,我創建了Excel 2013插件,當我調試它時,我無法引用Application.Workbook對象!下面是一個小例子:Office 2013 c#插件 - 空工作簿對象HRESULT:0x800A03EC錯誤

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,我收到錯誤:

「‘System.Runtime.InteropServices.COMException’類型的異常出現在ExcelAddIn1.dll但不在用戶代碼中處理「。

在應用程序對象許多屬性的檢查(快速手錶)具有值:

{System.Reflection.TargetInvocationException:異常已被調用的目標拋出。 ---> System.Runtime.InteropServices.COMException:舊格式或無效類型庫。 (異常來自HRESULT:0x80028018(TYPE_E_INVDATAREAD))」

看來申請對象有沒有工作簿,除其他問題 我敢肯定,代碼是好的,但也許有一些錯誤與我的.NET。框架或Office版本或建立設置? 任何人都可以擺脫任何光線就這個嗎?

**編輯** 1

因此,基於理查德摩根的建議我嘗試以下,已經看到,有可能是沒有當原始代碼運行時的活動工作簿:

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,它返回了一個引用而不會引發異常!

+0

http://stackoverflow.com/help/mcve – xxbbcc

+0

你確實有一個參考設置爲「Microsoft.Office.Interop」?如果是這樣,也許使用'Excel.Workbook'而不是'var' –

+0

感謝xxbbcc這現在是一個mcve – Flakker

回答

1

這是奇怪的代碼:

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加載項,特別是當用戶「做什麼」,以揭開序幕,我們的VSTO代碼ActiveWorkbookThisWorkbook,但他們有其他的Excel文件打開,或我們的VSTO任務需要花費一些時間,他們同時切換到另一個工作簿。

確保您的代碼處理正確的文件的最佳(唯一?)方法是始終使用傳遞到OnActivate函數的Workbook

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

至於0x800A03EC錯誤,它似乎是Excel的通用「這可能意味着什麼」COM錯誤之一。

我們在試圖工作時也看到了它其中Excel Workbook我們應該使用的對象。

+0

是的,這很奇怪,但對於這個例子,我只是選擇了我在列表中看到的第一個保證工作簿處於活動狀態的事件! – Flakker

0

由於加載項代碼未包含在工作簿中,因此未設置Application.ThisWorkbook屬性。 Application.ThisWorkbook屬性用於返回對包含代碼的工作簿的引用,並且不存在此類工作簿!

爲了獲得對當前打開的工作簿的引用並導致代碼執行,應該使用Application.ActiveWorkbook引用。

相關問題