从VBA调用C#时出现对象类型错误
本文关键字:对象 类型 错误 VBA 调用 | 更新日期: 2023-09-27 18:24:47
我有一个用C#编写的Excel加载项,我正试图从Excel中的VBA调用。在VBA中,我生成了几个要传递的数组:
Dim Identifiers() As Variant
Dim Variables() As Variant
Dim Times() As Variant
...
Dim QaddIn As COMAddIn
Dim QTool As Object
Dim results As Variant
Set QaddIn = Application.COMAddIns("QTool")
QaddIn.Connect = True
Set QTool = QaddIn.Object
results = QTool.GetQData(datasetName, Identifiers, Variables, Times, timeString)
GetQData
在C#中定义为:
string[] GetQData(string DatasetName, object[] Identifiers, object[] Variables, object[] TimeCodes,
string TimeString);
但是当我运行代码时,VBA会抛出错误object of type 'system.object[*]' cannot be converted to object of type 'system.object[]'
。这段代码可以很好地传递用静态长度定义的变量数组,如Dim Identifiers(3) As Variant
中所示。我现在想通过的考试有什么不同?
问题是我试图传递给C#的数组是从1索引的,也就是说,它是Array(1 to 5)
而不是Array(0 to 4)
。不幸的是,传递从1索引的数组失败了,因为Range.Value
和所有WorksheetFunction
方法都返回从1索引来的数组。
我在VBA中编写了以下代码,以便在传递数组之前从零重新索引数组:
Function ShiftArray(ThisArray() As Variant) As Variant
Dim lb As Long, ub As Long
Dim NewArray() As Variant
Dim i As Long
lb = LBound(ThisArray)
ub = UBound(ThisArray)
ReDim NewArray(0 To (ub - lb))
For i = 0 To (ub - lb)
NewArray(i) = ThisArray(i + lb)
Next i
ShiftArray = NewArray
End Function
问题是可变长度数组和固定长度数组不一样。vba通常会很宽容,所以你通常可以接受它,但C#不是。它不能确定您是否打算将数组转换为固定长度的数组。您应该在Identifiers对象上查找一个方法,将其转换为固定长度的数组。这可能会看起来像:
results = CIQTool.GetCIQData(datasetName, Identifiers.ToArray(), Variables.ToArray(), Times.ToArray(), timeString)
不过,我不确定该方法的确切名称,所以请使用代码完成来查找它。