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

但是我在测试过程中遇到了很多问题,因为有很多条件可以重置全局变量的值(如这里所讨论的)。

如何存储一个对象,以便只要工作簿处于打开状态,在重复调用我的BeforeDoubleClick事件的过程中,它的值就可用?

4

2 回答 2

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
于 2013-10-18T21:05:25.043 回答
0

确实,模块级变量(又称全局变量)的数据会一直存在,直到工作簿关闭,但代码的不完整执行(由于错误或故意中断)将重置变量,清除该数据。它也发生在静态变量上,即使静态变量在范围内是局部的,它们在持续时间方面也像模块级变量一样工作。

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

顺便说一句,字典对象没有 Create 方法。

于 2013-10-18T22:12:03.573 回答