无法将“System .__ ComObject”类型的COM对象转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”

时间:2017-01-16 11:44:00

标签: .net excel vb.net excel-interop

我正在编写一个使用Microsoft.Office.Interop.Excel程序集的类。它是“一站式”DLL库的一部分,它将在java解决方案中使用(限制java端的接口数量)。

我收到以下错误:

  

其他信息:无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Worksheets”。此操作失败,因为对于具有IID“{000208B1-0000-0000-C000-000000000046}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))

以下代码抛出了这个:

Public Class XL

    Public XL As Excel.Application = Nothing
    Public XLN As String
    Public WBS As Excel.Workbooks = Nothing
    Public WBSN() As String
    Public WB As Excel._Workbook = Nothing
    Public WBN As String
    Public WSS As Excel.Worksheets = Nothing
    Public WSSN() As String
    Public WS As Excel._Worksheet = Nothing
    Public WSN As String
    Public XLCelllValue As Object = Nothing

    Public Sub New()

        XL = New Excel.Application()
        XL.Visible = True

        WBS = XL.Workbooks
        WB = WBS.Add()

        WSS = WB.Worksheets '<this is the line that throws the exception
        WS = WSS(1)

    End Sub
End Class

我不确定我做错了什么属性都声明为public,Worksheets是一个有效的集合,WB属性类型是Excel._workbook,WSS属性类型是Excel.worksheets。

我缺少什么想法?

2 个答案:

答案 0 :(得分:0)

这是一种混淆。

WB.Worksheets会返回Sheets

的集合

所以你需要

    Dim WSS As Excel.Sheets = Nothing

答案 1 :(得分:0)

使用Sheets实例:

  

Sheets集合可以包含Chart或Worksheet对象。当您想要返回任何类型的工作表时,Sheets集合非常有用。如果您只需要使用一种类型的工作表,请参阅该工作表类型的对象主题。

考虑到这一点,请更改以下声明:

Public WSS As Excel.Worksheets = Nothing

要:

Public WSS As Excel.Sheets = Nothing

此外,我还注意到您使用的_Workbook_Worksheet无法访问DocEvents_Event成员。

您应该考虑使用继承自_Workbook的{​​{1}}和Workbook继承的Worksheet_WorksheetWorksheet都继承自Workbook,可让您访问以下成员:

enter image description here

如果您想使用处理程序但是认为值得注意,这只会很重要。

最后,在较小的音符上,您应该转为 Option Strict On 。这将有助于您编写更好的代码并在编译时生成潜在的运行时错误。就目前而言,这种代码DocEvents_Event,其中Option Strict On,将产生以下编译错误:

  

Option Strict On禁止来自&#39;对象&#39;的隐式转换to&#39; Microsoft.Office.Interop.Excel.Worksheet&#39;。

编译器通常会建议修复,在这种情况下修复将是:

WS = WSS(1)

在你的情况下,这可能不会产生运行时错误,但是通过Option Strict On你可以为自己节省很多的悲伤。