2013-08-07 59 views
1

如何將excel vba中的用戶定義類類型ByRef傳遞給vb.net?我有一個類似的帖子,處理傳遞雙數組here,我嘗試使用與我的UDT相同的方法,但它不起作用。有任何想法嗎?如何將UDT數組從excel vba傳遞到vb.net

+0

作爲一個快速的解決方案,你總是可以把它寫入一個文本/ excel文件,使淨打開它......否則,你需要解釋一下你要如何把它傳遞。 ...你是用VBA編寫這個程序,並調用一個.Net程序或者將它寫入.Net並使用Excel作爲中間步驟? –

+0

我有一個.net類庫,讓我可以在Excel中訪問COM。我創建了一個類的實例,並嘗試調用一個Sub例程,該例程將另一個UDT類的數組作爲參數,對數組元素執行操作並返回數組。 –

+0

就我所知,我不確定你可以。 UDT不是一個對象。你可以嘗試重構你的VBA代碼,並使UDT成爲一個類,然後傳遞給VB Variant,那麼任何方法調用都會遲到。但是,我不確定這是否可行。問題是yur VBA代碼沒有辦法導出定義類的信息(即在哪裏調用這樣一種方法)。相比之下,VB/C#可以處理雙精度/集合數組,因爲它們遵循標準/可以分別引用類型庫。如果您使用VB.NET,爲什麼您需要任何VBA代碼? –

回答

1

不好意思回答我自己的問題(再次),這個問題與我在這個問題中提到的其他問題非常相似,但我能夠以與其他問題的答案几乎相同的方式完成它。我只需要改變一些折射參數。

在vb.net代碼中,我將參數作爲一個對象,獲取該對象的類型(它可以識別爲object()數組),然後使用以下函數直接將該對象數組轉換爲所需的類數組在vb.net

Friend Function ComObjectArrayToPointArray(ByVal comObject As Object) As Point() 
    Dim thisType As Type = comObject.GetType 
    Dim fibType As Type = Type.GetType("System.Object[]") 
    Dim fibArray(0) As Point 
    If thisType Is fibType Then 
     Dim args(0) As Object 
     Dim numEntries As Integer = CInt(thisType.InvokeMember("Length", BindingFlags.GetProperty, _ 
             Nothing, comObject, Nothing)) 
     ReDim fibArray(numEntries - 1) 
     For j As Integer = 0 To numEntries - 1 
      args(0) = j 
      fibArray(j) = DirectCast((thisType.InvokeMember("GetValue", BindingFlags.InvokeMethod, _ 
            Nothing, comObject, args)), Point) 
     Next 
    End If 

    Return fibArray 

End Function 
相關問題