2012-02-16 3 views
0

Excel에서 추가 기능을 사용하려면 Excel에서 VBA를 호출해야합니다.Object Type VBA에서 C#을 호출하는 중 오류가 발생했습니다.

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#으로 정의됩니다 : VBA에서 나는 여러 가지 배열을 전달하는 생성

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에서와 같이 고정 길이로 정의 된 변형 배열을 잘 전달합니다. 내가 지금 통과하려고하는 것의 차이는 무엇입니까?

+0

GETCIQData 메서드와 같은 코드를 더 많이 제공 할 수 있습니까? C#이 Variant ... – MethodMan

+0

을 사용하지 않는다는 것을 명심하십시오. 이렇게 호출하려고 했으므로 .. 일부 호출 또는 메서드가 누락되었습니다.? – MethodMan

+0

C#은 변형을 사용하지 않습니다. 전달 된 배열을 객체 배열로 읽습니다. 내가 말했듯이, 그것은 고정 길이 배열로 잘 작동합니다. – Patrick

답변

1

문제는 C#에 전달하려고 시도한 배열이 1에서 인덱싱 된 것이므로 Array(0 to 4)이 아닌 Array(1 to 5)입니다. Range.ValueWorksheetFunction 모든 방법 1.

에서 인덱스 배열을 반환 때문에 내가 그들을 전달하기 전에 0에서 내 배열을 인덱싱하는 VBA에 다음 코드를 작성, 1 인덱스 배열을 전달하는 것은 실패 불행한 일 :

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 
0

가변 길이 배열과 고정 길이 배열은 동일하지 않습니다. vba는 일반적으로 꽤 용서할 것이므로 일반적으로 C#을 사용하지 않습니다. 배열을 고정 길이 배열로 변환한다는 것은 확실하지 않습니다. Identifiers 객체에서 메소드를 찾아 고정 길이 배열로 변환해야합니다. 그러면 아마도 다음과 같이 보일 것입니다 :

정확한 방법으로 이름을 붙일 수는 없지만 코드 완성을 사용하여 찾으십시오.

+0

VBA의 설명서가 좋지 않아서 그런 방법을 찾을 수 없었습니다. 하지만 내 대답에 설명 된대로 내 문제를 알아 냈어. 당신의 도움을 주셔서 감사합니다. – Patrick

관련 문제