【问题标题】:How to store an object that can be used in many event calls?如何存储可以在许多事件调用中使用的对象?
【发布时间】:2013-10-20 05:53:32
【问题描述】:

我有一个 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 事件期间,它的值就可用?

【问题讨论】:

  • 使您的代码稳定,这将是保持Public variable 价值的最佳保证。顺便说一句,为什么是 Global 而不是 Public
  • 将其存储为全局,但在使用之前检查它是否为Nothing:如果不存在则使用df.Create重新创建它

标签: vba excel


【解决方案1】:
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

【讨论】:

  • 嗨,您可能想解释一下dictFactory 是什么。一个类模块还是别的什么?
  • 那是来自原始问题 - 我没有介绍它。我认为这是 OP 创建的一个类。
【解决方案2】:

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

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

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

【讨论】:

  • 对,我写了一个 Create 方法来收集数据集,然后从该数据集中填充字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
相关资源
最近更新 更多