2013-10-18 29 views
3

我有一個Worksheet_BeforeDoubleClick事件檢查,看看廣告點擊一個細胞是否具有在一個Dictionary對象,像這樣的數據:如何存儲可用於多次事件調用的對象?

Private Sub Worksheet_BeforeDoubleClick(ByVal Target as Range, Cancel as Boolean) 

Dim dict as Dictionary 
Dim df as New dictFactory 

'returns a dictionary populated with all list items 
Set dict=df.create 

If dict.Exists(Target.Value) Then 
MsgBox "Exists" 
Else 
MsgBox "Doesn't exist" 
End If 

End Sub 

的問題是,這需要創建一個新的字典中的每個被點擊的單元時間。我認爲這將是很好的存儲字典中的全局變量自己的模塊中,像這樣:

Global valuesDict As New Dictionary 

,然後填充它在打開的工作簿:

Private Sub workbook_open() 

Dim df as New dictFactory 
Set valuesDict=df.create 

End Sub 

但我遇到在測試過程中有很多這種問題,因爲有很多的條件下,一個全局變量的值可以重置(如討論here)。

我怎麼能存儲的對象,以便其價值將可只要工作簿是開放的,在整個重複調用我的BeforeDoubleClick事件?

+0

使你的代碼穩定,這將是最好的保證,讓你'公共variable'值。順便說一句,爲什麼'全球'而不是'公共'? –

+1

存儲它作爲一個全球性的,但檢查使用它,看它是否是'Nothing'之前:如果它不存在,然後使用'df.Create' –

回答

5
Global valuesDict As Dictionary 'EDIT - drop the "new" 

Private Sub Worksheet_BeforeDoubleClick(ByVal Target as Range, Cancel as Boolean) 

'populate global only when needed 
if valuesDict is Nothing then CreateDict 

If dict.Exists(Target.Value) Then MsgBox "Exists" 
Else 
MsgBox "Doesn't exist" 
End If 

End Sub 
' 


Private Sub workbook_open() 
    CreateDict 
End Sub 
' 


Sub CreateDict() 
    Dim df as New dictFactory 
    Set valuesDict=df.create 
End sub 
+0

嗨重建它,你可能會想解釋什麼'dictFactory'是。一個類模塊或其他東西? –

+0

這是從原來的問題 - 我沒有介紹它。我認爲這是OP創建的一個類。 –

0

這是真的,模塊級變量(又名全局變量)的數據仍然存在,直到關閉工作簿,但代碼不完全執行(因錯誤或故意中斷)將重置變量,殲滅該數據。它發生在靜態變量上,即使靜態變量在本地範圍內,它也像模塊級變量一樣工作。

爲了安全起見,你可以在工作表模塊中編寫代碼來檢查,如果全局變量(引用字典)是有效的,如果不是,運行一個專門的程序來重新創建一個字典。

BTW,字典對象沒有Create方法。

+0

對,我寫了一個Create方法來收集數據集,然後填充該集的字典。 – sigil