2016-03-16 215 views
0

第一個問題在這裏。我一直在尋找這個問題的答案好幾天,並且已經解決了我一直在努力做的事情。我想分享我發現的內容,並希望有人能夠提出一個更好的方法來完成這項工作。VBA - 在函數之間傳遞對象

我有一個函數使用幾個類,然後需要返回這個信息在一個數組在其他地方使用。使用此代碼需要將此信息分解並重新使用返回的信息。它不是全部代碼塊的原因是該函數被調用很多次而不詢問返回值。

我們關心的Class模塊的一部分如下。這是我能夠實現它的唯一途徑。注意括號並計算參數。

Option Compare Database 
Option Explicit 

Private p_intaryAgentNames() As Integer 

Public Property Get AgentNames() As Variant 
     AgentNames = p_intaryAgentNames() 
End Property 

Public Property Let AgentNames(IncomingArray As Variant) 
    If IsArray(IncomingArray) Then 
     If UBound(p_intaryAgentNames) <> UBound(IncomingArray) Then ReDim Preserve p_intaryAgentNames(UBound(IncomingArray)) 
     p_intaryAgentNames() = IncomingArray 
    Else 
     MsgBox ("Invalid information passed to AgentNames array") 
    End If 
End Property 

Public Property Get Filter() As String 
    Filter = p_strFilter 
End Property 

Public Property Let Filter(value As String) 
    p_strFilter = value 
End Property 

Private Sub Class_Initialize() 

    ReDim p_intaryAgentNames(0) 

End Sub 

當完成我的功能,這是我用我的對象成員,把它們放到一個數組,然後將它傳遞給調用代碼:

Function CalculateRecords() As Variant 

Const CONSTANTSTRINGZEROLENGTH As String = "" 

Dim objRec1 As cAgent 
Dim objRec2 As cAgent 
Dim objRec3 As cAgent 

Set objRec1 = New cAgent 
Set objRec2 = New cAgent 
Set objRec3 = New cAgent 

Dim objAgents(2) As cAgent 
'some things happen 
Set objAgents(0) = objRec1 
Set objAgents(1) = objRec2 
Set objAgents(2) = objRec3 


CalculateRecords = objAgents 
End Function 

這是我計劃如何解壓數據,但它似乎並不像我使用的是正確的:

私人小組cmdAssignRecords_Click()

Dim cAgentInfo As Variant 
Dim objRec1 As cAgent 
Set objRec1 = New cAgent 
Dim objRec2 As cAgent 
Set objRec2 = New cAgent 
Dim objRec3 As cAgent 
Set objRec3 = New cAgent 

cAgentInfo = CalculateRecords() 'A variant to catch a variant 

Set objRec1 = cAgentInfo(0) 
Set objRec2 = cAgentInfo(0) 
Set objRec3 = cAgentInfo(0) 

我寧願做的是直接使用cAgentInfo(),並且這可以用於該類的其他對象。我不能做的是訪問cAgentInfo(0).AgentNames(0),而objRec1.AgentNames(0)和cAgentInfo(0).filter工作得很好。

我確定我只是在這裏錯過了一些東西,或者我只是把自己扔在牆上。任何關於我失蹤的建議,或者我可以改進的建議都是值得讚賞的。我覺得這樣做會提高可讀性,但這不是也浪費命名空間嗎?

回答

0

我聽不太清楚你的大設計,所以我儘量提示

Private Sub cmdAssignRecords_Click() 
'Dim cAgentInfo As Variant 
Dim cAgentInfo() As cAgent 
... 

'Function CalculateRecords() As Variant 
Function CalculateRecords() As cAgent() 

那樣你可以使用cAgentInfo(0).AgentNames(0)在函數中CalculateRecords

+0

這是什麼工作。我不知道我可以將該函數聲明爲我創建的類的數組。我以爲我只能將數組作爲變體傳遞。 – sweBers

0

嘗試宣告

Dim cAgentInfo As Variant 

像這樣的數組:

Dim cAgentInfo() As Variant 
+0

我試過了,因爲它似乎是最直接的方法。不幸的是,我無法將函數返回的變體數組分配給新的變體數組。解釋,我得到一個錯誤,指出我不能分配給一個數組。它雖然工作,當我更改cAgentInfo到cAgent數據類型。 – sweBers