对象类型错误从VBA调用C#

时间:2012-02-16 16:00:27

标签: c# vba vsto

我有一个用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中所示。我现在试图通过的是什么区别?

2 个答案:

答案 0 :(得分:1)

问题是我尝试传递给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

答案 1 :(得分:0)

问题是可变长度数组和固定长度数组不一样。一般来说,vba会非常宽容,所以你通常可以使用它,但C#不是。您无法确定是否要将数组转换为固定长度的数组。您应该在Identifiers对象上查找一个方法,将其转换为固定长度的数组。这可能看起来像:

results = CIQTool.GetCIQData(datasetName, Identifiers.ToArray(), Variables.ToArray(), Times.ToArray(), timeString)

我不确定该方法的确切命名,但请使用代码完成来查找它。