Лучшая практика для создания общедоступного объекта в Excel-VBA?

какова наилучшая практика создания Excel-VBA объект данных (Словарь, Список и т. д.) который доступен для всех участников приложения? Он должен быть объявлен как отдельный модуль или модуль класса?

например, я хочу создать объект словаря, различные подпрограммы которого захотят проверить пользовательский ввод (если он содержит или нет). Должен ли этот объект словаря быть собственным модулем, модулем класса или частью модуля, содержащего подпрограммы, которые использовать?

Примечание: этот вопрос является продолжением проверка, является ли значение членом списка

2 ответов


вы можете использовать следующую конструкцию (объявить myList объект как Public в верхней части модуля):

Public myList As Object

Sub Main()

    Call InitializeList

    'Do something with your Dictionary object

End Sub

Sub InitializeList()
    If Not myList Is Nothing Then Exit Sub

    Set myList = CreateObject("Scripting.Dictionary")

    myList.Add "item1", 1
    myList.Add "item2", 2
    myList.Add "item3", 3
End Sub

VBA может расстраивать людей, которые привыкли к приятным ООП-дружественным языкам, таким как Java и C#. Нам нужно принять ограничения VBA и просто сделать все возможное с тем, что он предлагает.

то, что вы описываете, почти звучит как то, что вы объявили бы Синглтоном на других языках.

моим решением было бы создать" основной " модуль (не Модуль класса). Там создайте частный словарь и создайте для него функцию общедоступного доступа. Эта воля позвольте вашим другим методам-э-э-функциям / сабам получить к нему доступ вслепую.

Private pMyList as Scripting.Dictionary

Public Property Get MyList() as Scripting.Dictionary

    If pMyList = Nothing Then
        Set pMyList = new Scripting.Dictionary
        pMyList("One") = "Red"
        pMyList("Two") = "Blue"
        pMyList("Three") = "Green"
    EndIf

    Set MyList = pMyList

End Property

Public Sub Cleanup
    Set pMyList = Nothing
    ' To deallocate arrays, use:
    ' Erase pArray
End Sub

'--------------------------------

Public Sub SomeRandomSubInAnotherModule()

    Dim theList As Scripting.Dictionary

    Set theList = MyList    ' If not yet initialized, will initialize
    ' Do whatever you need to do with theList
    Set theList = Nothing   ' Release the memory

End Sub

кстати, подпрограмма "очистка" - это просто хорошая практика. В конце макроса следует вызвать подпрограмму "очистка", чтобы освободить память, выделенную Excel для любых созданных вами объектов. Для модулей класса, вы можете поместить код очистки в

Public Sub Class_Terminate()

и он будет вызываться автоматически.

Примечание-предыдущий код потребует от вас добавить " Microsoft Среда выполнения сценариев " в качестве ссылки. Это дает вам полезные подсказки типа, когда вы работаете со словарем во время кода. Если по какой-то причине вы не хотите этого делать, Используйте этот код:

Private pMyList as Object

Public Property Get MyList() as Object

    If pMyList = Nothing Then
        Set pMyList = CreateObject("Scripting.Dictionary")
        pMyList("One") = "Red"
        pMyList("Two") = "Blue"
        pMyList("Three") = "Green"
    EndIf

    Set MyList = pMyList

End Property

Public Sub Cleanup
    Set pMyList = Nothing
End Sub