如何存储可在许多事件调用中使用的对象?

时间:2013-10-18 20:45:33

标签: vba excel-vba excel

我有一个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事件后,只要工作簿处于打开状态,如何存储对象以使其值可用?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

模块级变量(a.k.a.全局变量)的数据确实一直存在,直到工作簿关闭,但代码执行不完整(由于错误或故意中断)将重置变量,消除该数据。它也发生在静态变量上,就持续时间而言就像模块级变量一样工作,即使静态变量在本地范围内也是如此。

为安全起见,您可以在工作表模块中编写代码以检查全局变量(引用字典)是否有效,如果没有,则运行专用过程来重新创建字典。

BTW,字典对象没有Create方法。