2011-02-25 5 views
7

J'essaie de créer du code pour représenter un document de formulaire en utilisant VBA dans Word 2007. J'ai créé des classes pour représenter Section, QuestionSet et Question.VBA - Comment ajouter une collection à une collection de collections

J'ai donc 15 sections. J'ai créé une fonction pour créer chaque objet 'Section', l'ajoute à la collection 'Sections' puis détruis l'objet, le résultat étant que les objets restent persistants dans la collection (ou quelque chose).

Est-il possible d'utiliser la même méthode pour ajouter des collections à des collections ou devrais-je définir chaque collection de façon explicite?

code dans le module:

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 

Ensuite, on appelle cela via:

Sub Initilise() 

    Set Sections = New Collection 

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

End Sub 

Répondre

5

Oui. Vous pouvez absolument ajouter des collections aux collections à des collections à l'infini. Le code que vous avez posté semble ne fonctionner que si vous le regardez. Avez-vous des problèmes spécifiques?

MISE À JOUR: VBA ne passe que les références aux objets. Si vous détruisez explicitement un objet après l'avoir assigné à une collection (par exemple, Set myObj = Nothing), vous détruirez également l'objet à l'intérieur de la collection.

[EDIT]: Apparemment, ce n'est pas vrai. De this website (premier lié par Stevo dans les commentaires):

Pour utiliser les collections pour gérer des objets de classe , vous devez faire la suivante:

  • Créer une instance de la classe
  • Définissez les propriétés et méthodes de la classe
  • Ajouter la classe à une collection publique
  • Décharger l'instance de la classe

Vous pourriez attendre à ce que le déchargement l'instance des résultats de la classe dans la classe étant fermée et fin. Toutefois, l'objet de classe reste parce que vous l'ajoutez à une collection, qui possède alors la référence à la classe . C'est une technique très puissante qui vous permet de contrôler les références d'objets à travers une collection ; l'objet de classe ne se termine pas jusqu'à ce que vous le supprimiez de la collection .

MISE À JOUR: Il n'y a aucune raison pour laquelle vous ne pouvez pas ajouter une collection à un objet. Vous avez juste besoin de la classe à partir de laquelle votre objet est instancié pour supporter une telle méthode.Par exemple, dans votre module de classe clsSection vous avez besoin d'une méthode Add qui ajoute des objets qui lui sont transmis à une collection stockée dans le 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

Malheureusement, j'ai changé le code pour l'instant, pour essayer de créer simplement des collections indépendantes - mais J'ai reçu une erreur de la ligne 'Sections.Item (SectionName) .Add Qsets' dans la fonction 'DefineQuestionSet'. – Stevo

+0

Juste pour clarifier, le code ajoute les objets à la collection, puis détruit l'instance de l'objet, mais il reste persistant dans la collection, donc je n'ai pas besoin de garder une trace des objets. Est-ce la même chose pour les collections? créer la collection B, ajouter à la collection parent A, détruire la collection B, mais parce qu'il est ajouté à la collection A, il reste un «élément» dans la collection A. – Stevo

+0

le message d'erreur est l'objet jamais énigmatique 'ne supporte pas cette propriété ou méthode ' – Stevo

0

je pense avoir la réponse, mais si quelqu'un pourrait préciser que serait utile.

Je pense que ce que fait le code est d'essayer d'ajouter une collection à un objet - ce qui évidemment ne fonctionnera pas. J'ai donc besoin de créer une collection à laquelle je peux ajouter l'objet ET la collection. etc.

1

Essayez cet exemple simple:

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 

La fonction de suivi retourner une collection initializated

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

Peut-être que vous devriez utiliser 'Set createCollection = collezioneBuy' au lieu de' createCollection = collezioneBuy' dans 'createDetailCollection()'. – Ans

Questions connexes