VBA - Как добавить коллекцию в коллекцию коллекций - PullRequest
11 голосов
/ 25 февраля 2011

Я пытаюсь создать код для представления документа формы с использованием VBA в Word 2007. Я создал классы для представления Раздела, Вопросника и Вопроса.

Итак, у меня есть 15 Разделов.Я создал функцию для создания каждого объекта «Раздел», добавления его в коллекцию «Разделы», а затем уничтожения объекта, в результате чего объекты остаются постоянными в коллекции (или что-то в этом роде).

Возможно ли этоиспользовать один и тот же метод для добавления коллекций в коллекции, или мне придется явно определять каждую коллекцию?

Код в модуле:

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

Ответы [ 3 ]

7 голосов
/ 25 февраля 2011

Да .Вы можете абсолютно добавить коллекции в коллекции до бесконечности.Выложенный вами код выглядит так, как будто он должен работать, просто взглянув на него.У вас есть конкретные проблемы?

ОБНОВЛЕНИЕ : VBA передает только ссылки на объекты. Если вы явно уничтожите объект после присвоения его коллекции (например, Set myObj = Nothing), то вы также будете уничтожать объект внутри коллекции.

[РЕДАКТИРОВАТЬ]: Видимо, это не так.Начиная с этого веб-сайта (сначала Стиво связал его в комментариях):

Чтобы использовать коллекции для управления объектами класса, необходимо выполнить следующее:

  • Создание экземпляра класса
  • Установка свойств и методов класса
  • Добавление класса в общую коллекцию
  • Выгрузка экземпляра классаclass

Можно ожидать, что выгрузка экземпляра класса приведет к закрытию и прекращению работы класса.Однако объект класса сохраняется, потому что вы добавляете его в коллекцию, которой затем принадлежит ссылка на класс.Это очень мощный метод, который позволяет вам управлять ссылками на объекты через коллекцию;объект класса не завершается, пока вы не удалите его из коллекции.

ОБНОВЛЕНИЕ : Нет причин, по которым вы не можете добавить коллекцию в объект.Вам просто нужен класс, из которого создается ваш объект, для поддержки такого метода.Например, в вашем модуле класса 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
1 голос
/ 15 апреля 2015

Попробуйте этот простой пример:

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

Следующая функция возвращает инициализированную коллекцию

Function createDetailCollection()
    Dim collection As New collection
    createCollection = collezioneBuy
End Function
0 голосов
/ 25 февраля 2011

Я думаю, что у меня есть ответ сейчас, но если бы кто-то мог уточнить, это было бы полезно.

Я думаю, что код пытается добавить коллекцию к объекту - что, очевидно, не сработает. Поэтому мне нужно создать коллекцию, в которую я могу добавить объект И коллекцию. и т.д.

...