2011-02-25 107 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