Vba 作为参数传递字典

Vba 作为参数传递字典,vba,dictionary,Vba,Dictionary,我想将字典作为参数传递。 我的代码可能看起来有点奇怪,但无论如何我都要展示它: 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 myDi

我想将字典作为参数传递。 我的代码可能看起来有点奇怪,但无论如何我都要展示它:

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_保险公司类别中:

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_字典时,为什么它是空的?

您可以向字典添加任何您喜欢的内容,它的行为与您期望的不一样,因为您将字典传递到
get_Parameters_dictionary
中,但在填充后您永远不会返回它,相反,你把它分配给别的东西<代码>设置获取参数\u=myDictionary

这意味着
Set myDictionary=cInsurers.Get\u Parameters\u Dictionary(cInsurers,myDictionary)
myDictionary
重置为
Nothing
(由于未分配的返回类型)

您需要在
Get\u Parameters\u Dictionary()
中设置Get\u Parameters\u Dictionary=myDictionary,或者。。。不麻烦;字典是一种引用类型,因此在以下情况之后:

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

myDictionary
将反映在
Get\u Parameters\u Dictionary
中所做的更改是的,我注意到了错误。我将“获取参数”的名称改为“获取参数字典”。我想你的意思是圆括号里的“我的字典”吧?还有另一个问题,我无法通过执行以下操作来检索正确的类实例:set cInsurers=myDictionary.Item(20)(如示例所示)。它返回了错误的类实例,即添加到字典中的最后一个类实例。。。知道为什么吗?非常感谢!要调用带有参数但不捕获其返回值的函数,您不需要使用括号(如果您在调用前加上
call func(arg)
),则可以使用括号)-对于另一个函数,这通常是因为您重复使用引用,所以实际上要将同一个对象添加20次;见鬼,谢谢,伙计,就这样。我用的是同一个c_类对象,多蠢啊。只是一个非常重要的问题;我可以在将c_对象添加到字典后释放它吗?换句话说,是否正在制作该对象的副本?一个字典中可以存储多少个对象而不存在堆栈过载的风险?如果您
dict.add“key”,c_Insurers
将制作
c_Insurers
中引用的副本,这样您就可以
设置c_Insurers=nothing
,而不会影响字典中的内容(它不是您添加的对象的副本;它是一个引用;
c_保险公司
&字典条目是指向类的同一实例的指针。销毁
c_保险公司
不会影响类的基础实例,因为VBA知道还有另一个对它的活动引用(dict条目),所以会使它保持活动状态)