2012-06-11 130 views
2

我想傳遞字典作爲參數。 我的代碼可能看起來有點怪怪的,但無論如何,我會表現出來:在c_Insurers類傳遞字典作爲參數

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 

然後:

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時它是空的?

回答

1

你可以在字典中添加任何你喜歡的東西,它的行爲不像你期望的那樣,因爲你將字典傳遞到Get_Parameters_Dictionary,但是你永遠不會在它被填充後返回它,而是將它分配給其他東西; Set Get_Parameters_Insurers = myDictionary

這意味着Set myDictionary = cInsurers.Get_Parameters_Dictionary(cInsurers, myDictionary)重置myDictionaryNothing(因爲未分配的返回類型)。

您需要Set Get_Parameters_Dictionary = myDictionary in Get_Parameters_Dictionary()或...不要打擾;詞典是引用類型,以便後:

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

myDictionary將反映Get_Parameters_Dictionary所做的更改。

+0

是的,我注意到了這個錯誤。我將「Get_Parameters_Insurers」的名稱更改爲「Get_Parameters_Dictionary」。我想你的意思是圓括號之間的「cInsurers,myDictionary」?然後還有另一個問題,我無法通過執行來檢索正確的類實例:set cInsurers = myDictionary.Item(20)(例如)。它返回了我錯誤的類實例,即最後一個添加到字典中......任何想法爲什麼這可能是?非常感謝! – Trace

+1

要使用參數調用函數但不捕獲其返回值,請不要使用括號(如果您使用「Call func(arg)」調用前綴,則可以使用括號) - 對於另一個,通常是因爲您重新使用引用所以事實上加了20次相同的東西;看到http://stackoverflow.com/questions/2674341/excel-vba-passing-a-collection-from-a-class-to-a-module-issue –

+0

上帝該死,感謝的人就是這樣。我重新使用相同的c_Insurers類對象,多麼愚蠢。只是一個非常重要的問題;是否可以在將c_Insurers對象添加到字典後釋放它,換句話說,它是正在製作的對象的副本?多少個對象可以存儲在字典中,而不會有堆棧超載的風險? – Trace