【问题标题】:Storing custom class in a public VBA collection将自定义类存储在公共 VBA 集合中
【发布时间】:2016-07-04 22:35:22
【问题描述】:

我正在使用 VBA 在 Word 中制作一个测验生成器应用程序。用户一次生成一个问题,所以我试图将所有问题存储在公共集合中。将问题对象添加到集合中的子如下:

Option Explicit

Public questionCollection As VBA.Collection

'Initialize question collection
Sub addToQuestionCollection(cQuestion As Object)

    Dim key As Long
    'Set question collection if it has not yet been initialized
    If questionCollection Is Nothing Then
        Set questionCollection = New VBA.Collection
    End If

    'Generate key for question
    key = Bas04CRC32Hash.CRC32(cQuestion.question)

    'Assign key to question
    cQuestion.Id = key

    'Adds question object to question collection
    questionCollection.add cQuestion, CStr(key)

End Sub

子例程执行得非常好,但是一旦它结束,集合就会丢失值并变为空。我很肯定 questionCollection 在我的项目中永远不会变暗(我现在必须检查 20 次)所以范围声明不会是问题。如何确保集合在文档保持打开状态时保留所有问题对象?

谢谢

【问题讨论】:

  • 确保代码在模块中,而不是在用户表单中。
  • 代码确实在公共模块中

标签: vba ms-word


【解决方案1】:

经过一番挖掘,我找到了答案:

我的测验生成器使用 OLEObjects 来表示问题。显然,创建 OLEObject 会动态重置全局变量,这真的很糟糕。如果有人知道解决此问题的方法,我将不胜感激。

【讨论】:

  • 您可以改用表单控件吗?我想你已经想到了。
  • 不幸的是,它们并不真正适合我的需求......我正在做一些非常迂回的事情,并且可能不明智地处理它:我正在创建一个密码保护模块,它可以动态存储所有问题数据,然后在评估测验时,它将一次构建所有类。它肯定有它的缺点,但它似乎是最可行的。
  • 想一想:假设您实际上是在向文档的表面添加对象,AIUI 就会出现问题,因为当您这样做时,会重新编译文档对象的代码。因此,如果 代码 位于一个模板中,而该模板不是 要添加这些控件的文档,它会起作用吗?您能否以其他方式表示您正在存储的数据(例如,使用内容控件,如果您还显示数据,或自定义 XML 部件 - 基本上都仅限于 WINdows - 或 Word 变量)?
  • 不幸的是,企业希望这样做的方式是作为一个单一的程序来简化分发。单词变量可能是一种选择,但我没有考虑过。我将对此进行调查,看看是否能提供有效的解决方案。
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
相关资源
最近更新 更多