2017-06-20 33 views
1

我在VBA中使用腳本字典在Excel 2010中保存1,840,000個鍵和值對。我想聲明並填充它們一次,然後在我的模塊和函數中使用它們。在內存中保留腳本字典VBA

對於初學者,我宣佈口譯是公開的,使用Public dict As Scripting.Dictionary,然後我將它填充到worksheet_activate()。我如何保存並在其他mod中使用它?

謝謝

+0

模塊中的任何公共正如Ash所說的,要麼將它作爲子/功能的論據。好的東西是不會丟失字典在休息/錯誤... –

+0

@ A.S.H我命名公共子「workbook_activate()」,它並沒有運行時,工作簿打開。然而,當我使用「worksheet_activate()」時,只要我的mod仍在該sheet/mod文件中,它就很棒。一旦離開,字典中的值就會被清除。 – wizlog

+0

@PatrickLepelletier你是否暗示字典通常會擦除錯誤? – wizlog

回答

3

作爲一個良好的編程習慣,在吸氣功能包這樣的變量,並隱藏全局變量作爲本地裏面靜態。首次使用時填充它。

爲了做到這一點,寫一個標準模塊中此功能:

Public Function getMyDictionary() as Scripting.Dictionay 
    Static dict as Dictionary ' static: will keep state across different calls 

    If dict Is Nothing Then 
     Set dict = new Scripting.Dictionary 
     '''''''''''''''''''' 
     dict.Add "foo", "bar" 
     ' etc... 
     ' Code to populate dictionary 
     ' 
     '''''''''''''''''''' 
    End If 
    Set getMyDictionary = dict 
End Function 

現在只要您需要引用字典,只要是這樣的:

If getMyDictionary.Exists("foo") Then doStuff 

這個成語有很多優點:

  • 字典在首次使用時填充。如果在Excel會話期間不需要,它將不會被填充。

  • 你不再需要擔心「我什麼時候填寫我的字典」。這將是可用的和填充隨時隨地需要

  • ,如果該項目因一些運行時錯誤卸載,所有的全局變量都被複位。特別是,對象重置爲Nothing。包裝函數正確處理情況並以透明方式重新填充字典。

  • TLDR ...全局字典是隱藏的,對它的訪問(在某種程度上)是受控的。 「在某種程度上」,因爲其他代碼仍然可以操作它(插入,刪除...)。如果一個人需要通過更多的控制權,例如允許其他代碼爲只讀它,然後把它安排在類模塊僅暴露允許的功能的私有成員......

+0

如何評估「foobar」,這是什麼目的呢? 是不是/不應該是一個布爾getMyDictionary足夠? – wizlog

+0

@wizlog偉大的,但不要忘記'Set dict = new Scripting.Dictionary',我只是加了它:) –

+0

A.S.H.,只要我運行一個位於另一個對象中的子文件(閱讀:工作表),我鬆散地訪問了我剛剛創建的字典,並將其填充到您發佈的函數中,儘管它是靜態的。 – wizlog