2015-11-24 5 views
-1

Я пробовал несколько вещей и до сих пор получаю эту ошибку. Я создаю excel VSTO с помощью VBA и Visual Studio.Невозможно передать COM-объект типа «Excel.WorksheetClass» для надстройки VSTO

Способ, которым у меня установлена ​​эта настройка, есть кнопка на ленте и что пользователь может щелкнуть, и она будет проходить через все таблицы. Я предполагаю, что моя проблема заключается в том, что вы фактически подключаетесь к текущему активному экземпляру 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 ошибки при печати.

1- wks переменной должно быть установлено в Excel.Worksheet, так как это WorksheetMicrosoft.Office.Tools.Execl.Worksheet в то время как тип мне нужно Microsoft.Office.Interop.Excel.Sheet

2- То же самое для переменной objList. Должно быть Excel.ListObject вместо ListObject

3- мне нужно искать коллекцию Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets

Это проясняет все ошибки и позволяет коду функционировать без сбоев.

0

Вам нужно проверить, есть ли рабочий лист (isnot ничего)

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

EDIT: здесь рабочий пример, но в 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

И затем используйте 'vstoWorkbook' как' In' в 'For Each wks In vstoWorkbook'? – Adjit

+0

Пробовал эту, но такую ​​же ошибку, можете ли вы обеспечить ее использование? – Adjit

+0

Я думаю, вы должны объявить переменную Excel.Workbook, создать экземпляр в ActiveWorkbook, прежде чем использовать его в цикле. Что-то вроде: 1) Dim 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 объекту приложения не имеет смысла - два разных несовместимых типа. Попробуйте это вместо этого:

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 
Смежные вопросы