2016-03-16 176 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