VBA - 在函数之间传递对象

时间:2016-03-16 20:30:42

标签: arrays vba class object ms-access-2007

这里的第一个问题。我好几天都在寻找这个问题的答案,并且已经解决了我自己一直想做的事情。我想分享我发现的内容,并希望有人可以建议更好的方法来完成这项工作。

我有一个使用多个类的函数,然后需要在数组中返回此信息以供其他地方使用。使用它的代码需要将这些信息分解回来,并重用返回的信息。它不是所有代码块的原因是该函数被多次调用而没有要求返回值。

我们关注的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

这就是我计划解压缩数据的方式,但我似乎没有正确使用它:

Private Sub 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工作得很好。

我确定我在这里错过了一些东西,或者我可能只是把自己扔在墙上。关于我缺少什么,或者我如何改进的任何建议都得到了很好的赞赏。我觉得这样做会提高可读性,但是它也不会浪费命名空间吗?

2 个答案:

答案 0 :(得分:0)

尝试声明

Dim cAgentInfo As Variant 

像这样的数组:

Dim cAgentInfo() As Variant

答案 1 :(得分:0)

我无法抓住你的大设计,所以我尝试建议

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

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

这样你就可以在函数CalculateRecords中使用cAgentInfo(0).AgentNames(0)