【问题标题】:Pass dictionary as parameter将字典作为参数传递
【发布时间】:2012-06-11 20:13:45
【问题描述】:

我想将字典作为参数传递。 我的代码可能看起来有点奇怪,但我还是会展示它:

Sub get_Insurers_Dictionary()

Dim cInsurers               As c_Insurers
Dim myDictionary            As Scripting.Dictionary

Set cInsurers = New c_Insurers

Set myDictionary = New Scripting.Dictionary
Set myDictionary = cInsurers.Get_Parameters_Dictionary(cInsurers, myDictionary)

End Sub

然后在 c_Insurers 类中:

Public Function Get_Parameters_Dictionary(cInsurers As c_Insurers, myDictionary As Dictionary) As Dictionary

Dim oSheet                      As Excel.Worksheet
Dim cParameters                 As c_Parameters


Set oSheet = ThisWorkbook.Sheets("Parameters_Insurers")
oSheet.Activate

Set cParameters = New c_Parameters
Set cParameters = cParameters.Get_Parameters(cParameters, oSheet)

Me.fPartner_ID_Col = cParameters.get_Header_Cols(oSheet, cParameters.fMax_Col, "INSURER_ID")
Me.fPartner_Name_Col = cParameters.get_Header_Cols(oSheet, cParameters.fMax_Col, "INSURER_NAME")
Me.fCountry_Col = cParameters.get_Header_Cols(oSheet, cParameters.fMax_Col, "COUNTRY")

For lcnt = 1 To UBound(cParameters.fArray)
    myDictionary.Add cParameters.fArray(lcnt, Me.fPartner_ID_Col), Me.Get_Parameters_Class(cInsurers, cParameters, lcnt)
Next lcnt

Set Get_Parameters_Insurers = myDictionary
Set cParameters = Nothing

End Function

抛开看似复杂的代码,我的问题很简单:是否可以将类对象添加为项目? (我还不习惯使用字典)。我的字典填在c_insurers类里,为什么我回到get_Insurers_Dictionary里面却是空的?

【问题讨论】:

    标签: vba dictionary


    【解决方案1】:

    您可以将您喜欢的任何内容添加到字典中,它的行为与您预期的不同,因为您将字典传递给 Get_Parameters_Dictionary 但在填充后您永远不会返回它,而是将其分配给其他东西; Set Get_Parameters_Insurers = myDictionary.

    这意味着Set myDictionary = cInsurers.Get_Parameters_Dictionary(cInsurers, myDictionary) 将myDictionary 重置为Nothing(因为未分配的返回类型)。

    您需要在Get_Parameters_Dictionary() 中使用Set Get_Parameters_Dictionary = myDictionary 或者......不要打扰;字典是引用类型,所以之后:

    Set myDictionary = New Scripting.Dictionary
    cInsurers.Get_Parameters_Dictionary cInsurers, myDictionary
    

    myDictionary 将反映在 Get_Parameters_Dictionary 中所做的更改。

    【讨论】:

    • 是的,我注意到了错误。我将“Get_Parameters_Insurers”的名称更改为“Get_Parameters_Dictionary”。我想你的意思是圆括号之间的“cInsurers,myDictionary”?然后还有另一个问题,我无法通过以下操作检索正确的类实例: set cInsurers = myDictionary.Item(20) (例如)。它返回了错误的类实例,即添加到字典中的最后一个实例......知道为什么会这样吗?非常感谢!
    • 要调用带有参数但不捕获其返回值的函数,您不使用方括号(如果您在调用前加上Call func(arg),则可以)-至于其他通常是因为您重新使用参考,因此实际上添加了 20 次相同的东西;见stackoverflow.com/questions/2674341/…
    • 该死的,谢谢老兄。我正在重新使用相同的 c_Insurers 类对象,多么愚蠢。只是一个非常重要的问题;我可以在将 c_Insurers 对象添加到字典后释放它吗,换句话说,是否正在制作对象的副本?有多少对象可以存储在字典中而不会有堆栈过载的风险?
    • 如果您 dict.add "key", c_Insurers 复制了 c_Insurers 中的引用,那么您可以 set c_Insurers=nothing 而不影响字典中的内容(它不是您添加的对象的副本;它是引用;c_Insurers 和字典条目是指向该类的同一实例的指针。销毁 c_Insurers 不会影响该类的底层实例,因为 VBA 知道还有另一个对它的活动引用(dict 条目)所以会保持活力)
    猜你喜欢
    • 2021-09-26
    • 2021-09-27
    • 2021-12-14
    • 2019-11-18
    • 1970-01-01
    • 2019-09-14
    • 2016-10-10
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多