2015-11-24 122 views
-1

我嘗試過幾件事情,但仍然收到此錯誤。我正在使用VBA和Visual Studio創建一個excel VSTO。無法投射VSTO插件類型'Excel.WorksheetClass'的COM對象

我有這種設置的方式是在功能區中有一個按鈕,用戶可以單擊它並通過並取消列出所有表。我想我的問題在於實際掛鉤到Excel的當前活動實例以遍歷工作表。

An exception of type 'System.InvalidCastException' occurred in ConvertAllTablesToRange.dll but was not handled in user code

Additional information: Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Tools.Excel.Worksheet'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{297DC8D9-EABD-45A1-BDEF-68AB67E5C3C3}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

這是我已經試過:

Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click 

    Dim wks As Worksheet, objList As ListObject 

    For Each wks In Globals.ThisAddIn.Application.ActiveWorkbook ' ERROR LINE 

     For Each objList In wks.ListObjects 
      objList.Unlist() 
     Next objList 

    Next wks 
End Sub 

Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click 
    Dim wks As Worksheet, objList As ListObject 
    Dim exApp As Excel.Application 

    exApp = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets 

    For Each wks In exApp.Worksheets 
     For Each objList In wks.ListObjects 
      objList.Unlist() 
     Next objList 
    Next wks 
End Sub 

這兩者拋出同樣的錯誤

回答

0

事實證明,有3個類型轉換錯誤。因爲Worksheet

1-的wks變量需要被設置爲Excel.WorksheetMicrosoft.Office.Tools.Execl.Worksheet而我需要的類型是Microsoft.Office.Interop.Excel.Sheet

2-也是一樣的objList變量。需要成爲Excel.ListObject代替ListObject

3-我需要搜索的集合Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets

這清除了所有的錯誤,並允許代碼運行,不會失敗。

0

你需要檢查,如果有一個工作表(不是什麼)

Dim NativeWorkbook As Microsoft.Office.Interop.Excel.Workbook = 
Globals.ThisAddIn.Application.ActiveWorkbook 
If NativeWorkbook IsNot Nothing Then 
Dim vstoWorkbook As Microsoft.Office.Tools.Excel.Workbook = 
    Globals.Factory.GetVstoObject(NativeWorkbook) 
End If 

詳細信息請參閱:here msdn

編輯:在這裏工作的例子,但在C#中,而不是在VB.NET,我覺得你可以把它,因爲我在VB.NET不是很有效:

Microsoft.Office.Interop.Excel.Application XL = Globals.ThisAddIn.Application; 
      Microsoft.Office.Interop.Excel.Workbook xlWorkBook = default(Microsoft.Office.Interop.Excel.Workbook); 
      xlWorkBook = XL.ActiveWorkbook; 
      foreach (Microsoft.Office.Interop.Excel.Worksheet xs_loopVariable in xlWorkBook.Sheets) 
      { 
        foreach (Microsoft.Office.Interop.Excel.ListObject objList in xs_loopVariable.ListObjects) 
        { 
        objList.Unlist(); 
        } 
      } 
+0

然後在'For Each wks In vstoWorkbook'中使用'vstoWorkbook'作爲'In'? – Adjit

+0

試過這個,但同樣的錯誤,你能提供這個用法嗎? – Adjit

+0

我認爲你必須聲明一個Excel.Workbook變量,在ActiveWorkbook中實例化之後才能在循環中使用它。例如:1)昏暗的wkb作爲Excel.Workbook .... 2)wkb = Globals.ThisAddIn.Application.ActiveWorkbook ... 3)對於每個wks在Wkb – Malick

0

在普通的香草VBA,您可以適應您的要求:

引用到工作表來自於工作表集合,以便代碼塊#1應該有:

For Each wks In Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets 

在代碼塊#2中,將Worksheets集合分配給Application對象是沒有意義的 - 兩種不同的,不兼容的類型。試試這個:

Dim exApp As Excel.Application 

' VBA requires Set for assigning any object type - remove 
' the Set keyword if not needed in your approach 
Set exApp = Globals.ThisAddIn.Application 

For Each wks In exApp.ActiveWorkbook.Worksheets 
相關問題