无法将“System .__ ComObject”types的COM对象转换为接口types“Microsoft.Office.Interop.Excel.Worksheets”
我在写一个利用Microsoft.Office.Interop.Excel程序集的类。 这是一个“一站式”DLL库的一部分,它将被用于一个Java解决scheme(限制在Java端的接口数量)。
我收到以下错误:
其他信息:无法将“System .__ ComObject”types的COM对象转换为“Microsoft.Office.Interop.Excel.Worksheets”types的接口。 此操作失败,因为IIC“{000208B1-0000-0000-C000-000000000046}”接口的COM组件上的QueryInterface调用失败,原因是出现以下错误:没有支持此接口(exception来自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
我不知道我在做什么错所有的属性被声明为公共的,工作表是一个有效的集合WB属性types是Excel._workbook和WSS属性types是Excel.worksheets。
任何想法我失踪?
使用表格实例:
Sheets集合可以包含Chart或Worksheet对象。 当您想要返回任何types的表单时,表单集合非常有用。 如果您需要使用仅有一种types的工作表,请参阅该工作表types的对象主题。
考虑到这一点,请更改以下声明:
Public WSS As Excel.Worksheets = Nothing
至:
Public WSS As Excel.Sheets = Nothing
此外,我还注意到,您正在使用_Workbook和_Worksheet ,它们无法访问DocEvents_Event成员。
您应该考虑使用从_Workbook
inheritance的_Workbook
和Worksheetinheritance的_Worksheet
。 Worksheet
和Workbook
都inheritance自DocEvents_Event
,它可以让您访问以下成员:
这只是如果你想使用处理程序,但认为值得注意的事情。
最后,在一个小的笔记,你应该把选项严格打开 。 这将有助于编写更好的代码,并在编译时产生潜在的运行时错误。 就目前而言,这种带有Option Strict On的代码WS = WSS(1)
将会产生下面的编译错误:
Option Strict On不允许从“对象”到“Microsoft.Office.Interop.Excel.Worksheet”的隐式转换。
通常编译器会提示一个修复,在这种情况下修复将是:
WS = CType(WSS(1), Excel.Worksheet)
在你的情况下,这可能不会创build一个运行时错误,但是通过使用Option Strict On,你可以节省很多的痛苦。
这是一个混合types。
WB.Worksheets
返回Sheets
的集合
所以你需要
Dim WSS As Excel.Sheets = Nothing