2011-02-25 41 views
7

Estoy intentando crear código para representar un documento de formulario usando VBA en Word 2007. He creado clases para representar Section, QuestionSet y Question.VBA - Cómo agregar una colección a una colección de colecciones

Así que tengo 15 Secciones. Creé una función para crear cada Objeto 'Sección', lo agregué a la Colección 'Secciones' y luego destruí el objeto, el resultado es que los objetos permanecen persistentes en la colección (o algo así).

¿Es posible utilizar el mismo método para agregar colecciones a las colecciones o tendré que definir cada colección explícitamente?

Código

en el Módulo:

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 

Entonces esto se llama a través de:

Sub Initilise() 

    Set Sections = New Collection 

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

End Sub 

Respuesta

5

. Puede absolutamente agregar colecciones a colecciones a colecciones infinitas. El código que ha publicado parece que debería funcionar solo al echar un vistazo. ¿Tienes problemas específicos?

ACTUALIZACIÓN: VBA solamente pasa alrededor de referencias a objetos. Si destruye explícitamente un objeto después de asignarlo a una colección (por ejemplo, Set myObj = Nothing), también destruirá el objeto dentro de la colección.

[EDITAR]: Aparentemente esto no es cierto. De this website (primera unidos por Stevo en los comentarios):

Para utilizar colecciones para administrar objetos de clase, debe hacer lo siguiente:

  • crear una instancia de la clase
  • Establecer las propiedades y métodos de la clase
  • Añadir a la clase a una colección pública
  • Unload la instancia de la clase

se podría esperar que la descarga la instancia de los resultados de la clase en la clase siendo cerrados y terminados. Sin embargo, el objeto de clase persiste porque lo agrega a una colección, que posee la referencia a la clase . Esta es una técnica muy poderosa que le permite controlar referencias de objetos a través de una colección ; el objeto de clase no finaliza hasta que lo elimine de la colección .

ACTUALIZACIÓN: No hay ninguna razón por la cual no se puede agregar una colección a un objeto. Solo necesita la clase desde la que se crea una instancia de su objeto para admitir dicho método.Por ejemplo, en el módulo de clase clsSection necesita un método Add que añade objetos que se le pasan a una colección almacenada en el 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

Por desgracia he cambiado el código de momento, para tratar de simplemente crear colecciones independientes - sin embargo, Obtuve un error de la línea 'Sections.Item (SectionName) .Add Qsets' en la función 'DefineQuestionSet'. – Stevo

+0

Solo para aclarar, el código agrega los objetos a la colección y luego destruye la instancia del objeto, pero permanece persistente en la colección, por lo que no es necesario que realice un seguimiento de los objetos. ¿Es lo mismo para las colecciones? es decir, crear la colección B, agregar a la colección primaria A, destruir la colección B, pero como se agregó a la colección A, sigue siendo un 'elemento' en la colección A. – Stevo

+0

el mensaje de error es el siempre enigmático 'objeto no admite esta propiedad o método ' – Stevo

0

creo que tengo la respuesta, pero si alguien puede aclarar que sería servicial.

Creo que lo que está haciendo el código está tratando de agregar una colección a un objeto - que obviamente no va a funcionar. Entonces necesito crear una colección a la que pueda agregar el objeto Y la colección. etc.

1

Pruebe este sencillo ejemplo:

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 función de seguimiento devolver una colección initializated

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

Quizás debería usar 'Set createCollection = collezioneBuy' en lugar de' createCollection = collezioneBuy' en 'createDetailCollection()'. – Ans

Cuestiones relacionadas