2016-07-19 9 views
0

Ich habe den folgenden Code:Wie wird Microsoft.Office.Interop.Excel.Application.Run in vb.net umgewandelt?

Dim technologyMapping = oXL.Run("GetTechnologyMapping") 

Das Ergebnis ist ein Objekt. In meinem VBA (Makro) Code, kehre ich ein Collection wie unten dargestellt:

Public Function GetTechnologyMapping() As Collection 
    ' ... 
    Set GetTechnologyMapping = result 
End Function 

ich über CType und CTypeDynamic zu werfen bin versucht hatte aber das Glück jetzt so weit. Jedes Mal, wenn der Code eine Ausnahme auslöst, kann ich dieses Objekt nicht darstellen, obwohl das Objekt die Eigenschaft Count hat. Wie kann ich dieses Objekt in eine Sammlung umwandeln?

+0

Sie führen ein Makro, dass die einzige Person, der weiß, was es gibt, sind Sie. Die Sammlung ist drastisch unwahrscheinlich, der vb.net-Typ ist kein VBA-Typ. Sehen Sie sich den Makrocode an. –

+0

Die zweite Auflistung zeigt den wichtigen Teil des Makros. Ja, es ist eine Sammlung. – Freddy

+1

Eine von VBA-Code zurückgegebene Sammlung kann in VB.NET nicht direkt verwendet werden, da es sich um einen privaten VBA-Typ handelt. Daher ist das Umwandeln nicht möglich. Sie müssen das Objekt beibehalten und den spät gebundenen Code verwenden. –

Antwort

2

Sie können eine VBA.Collection in eine System.Collections.IEnumerable umwandeln. Auf diese Weise können Sie die Sammlung mit einer For Each-Schleife auflisten.

Etwas wie folgt aus:

Sub Test(wbPath As String) 
    Dim app As New Excel.Application 
    Dim wb As Excel.Workbook = app.Workbooks.Open(wbPath) 
    Dim result As Object = app.Run("ReturnCollection") 
    wb.Close(Excel.XlSaveAction.xlDoNotSaveChanges) 
    app.Quit() 

    Dim colAsIEnumerable As System.Collections.IEnumerable = TryCast(result, System.Collections.IEnumerable) 

    If colAsIEnumerable IsNot Nothing Then 
     For Each o As Object In colAsIEnumerable 
      If o IsNot Nothing Then Debug.Print(o.ToString()) 
     Next 
    End If 
End Sub 
Verwandte Themen