Лучшая практика для создания общедоступного объекта в 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