2011-02-25 68 views
7

我想创建代码来使用Word 2007中的VBA来表示表单文档。我创建了表示Section,QuestionSet和Question的类。VBA - 如何将集合添加到集合

所以我有15个部分。我创建了一个函数来创建每个'Section'对象,将它添加到'Sections'集合中,然后销毁该对象,结果是对象在集合(或某物)中保持持久性。

是否可以使用相同的方法将集合添加到集合中,还是我必须明确定义每个集合?

代码模块中:

Public Sections As Collection 

Function DefineSection(ByVal SectionName As String) 

    Set Section = New clsSection 
    Section.myName = SectionName 
    Sections.Add Section, SectionName 

End Function 


Function DefineQuestionSet(ByVal SectionName As String, ByVal Name As String, ByVal NoOfQuestions As Integer, ByVal IsMutuallyExclusive As Boolean, Optional ByVal DependentOnSection As String) 

    Dim Qsets As Collection 

    Set Qsets = New Collection 
    Set QuestionSet = New clsQuestionSet 

    QuestionSet.Name = Name 
    QuestionSet.NoOfQuestions = NoOfQuestions 
    QuestionSet.MutuallyExclusive = IsMutuallyExclusive 

    If Not (DependentOnSection) = "" Then 
     QuestionSet.DependentOnSection = DependentOnSection 
    End If 

    Qsets.Add QuestionSet 
    Sections.Item(SectionName).Add Qsets 

End Function 

那么这是通过被称为:

Sub Initilise() 

    Set Sections = New Collection 

    DefineSection "PersonalDetails" 
    DefineQuestionSet "PersonalDetails", "PersonalDetails", 29, False 

End Sub 

回答

5

。您可以绝对地将集合添加到收藏集中。你发布的代码看起来应该只是通过浏览它而发挥作用。你有特定的问题吗?

UPDATE:VBA只传递引用到对象。 如果您在将对象分配给集合(例如,Set myObj = Nothing)之后明确销毁该对象,那么您也将销毁集合中的对象。

[编辑]:显然这是不正确的。从this website(首先由斯特沃在评论链接):

为了使用集合来管理 类对象,必须执行 如下:

  • 创建类的实例
  • 设置属性和类
  • 的方法的类添加到公共收集
  • 卸载的类的实例

您可能希望卸载 类结果的实例中 类被关闭和终止。 但是,类对象持续存在 ,因为您将它添加到集合 ,该集合然后拥有对 类的引用。这是一个非常强大的 技术,允许您通过 集合控制 对象引用;类对象不会 终止,直到您从 集合中删除它。

UPDATE:没有理由不能将集合添加到对象。你只需要你的对象实例化的类来支持这种方法。例如,你的clsSection类模块中,你需要一个Add方法,增加了传递给它的对象存储在clsSection集合:

Private QSetsColl As Collection 

Public Sub Add(QSets As Object) 
    If QSetsColl Is Nothing Then Set QSetsColl = New Collection 
    QSetsColl.Add QSets 
End Sub 
+0

不幸的是我已经改变了代码,现在,尝试只是创建独立的收藏 - 然而我在'DefineQuestionSet'函数中收到了一行 'Sections.Item(SectionName).Add Qsets'中的错误。 – Stevo 2011-02-25 16:07:06

+0

为了澄清,代码将对象添加到集合中,然后销毁对象的实例,但它仍然保留在集合中,因此我不必跟踪对象。这些收藏品是否一样?即创建集合B,添加到父集合A,销毁集合B,但因为它被添加到集合A中,所以它仍然是集合A中的一个'项目'。 – Stevo 2011-02-25 16:12:01

+0

错误消息是永远神秘的'对象不支持此属性或方法' – Stevo 2011-02-25 16:20:49

0

我想我有答案了,但如果有人能澄清这将是很有帮助。

我认为代码正在做的是试图将一个集合添加到一个对象 - 这显然是行不通的。所以我需要创建一个集合,我可以添加对象和集合。等

1

试试这个简单的例子:

Private Sub CommandButton1_Click() 

    Dim masterCollection As New collection 
    masterCollection.Add "first key", createDetailCollection() 
    masterCollection.Add "second key", createDetailCollection() 
    masterCollection.Add "third key", createDetailCollection() 

End Sub 

后续函数返回一个initializated收集

Function createDetailCollection() 
    Dim collection As New collection 
    createCollection = collezioneBuy 
End Function 
+0

也许你应该在'createDetailCollection()'中使用'Set createCollection = collezioneBuy'而不是'createCollection = collezioneBuy'。 – Ans 2017-09-12 15:03:47