Ладно, благодаря Алену и KyleNZ я теперь нашел рабочий способ сделать это, не имея коллекцию или перечисляемый объект ниже.
В основном, благодаря названию!Оператор, я выяснил, что доступ через оператор bang / pling эквивалентен доступу к элементу объекта по умолчанию.Если свойство Value
является членом по умолчанию для моего модуля класса, то есть три эквивалентных оператора для доступа к этому свойству:
obj.Value("param")
obj("param")
obj!param
Таким образом, чтобы короткий синтаксис работал для модуля пользовательского класса, вседолжен сделать, это определить элемент по умолчанию.Например, теперь я использовал следующее свойство Value
:
Property Get Value(name As String) As String
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
Обычно вы можете получить к нему следующий доступ:
obj.Value("foo") = "New value"
MsgBox obj.Value("foo")
Теперь, чтобы сделать это свойство элементом по умолчанию,Вы должны добавить строку в определение свойства:
Attribute Value.VB_UserMemId = 0
Итак, я получаю следующее:
Property Get Value(name As String) As String
Attribute Value.VB_UserMemId = 0
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
Attribute Value.VB_UserMemId = 0
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
И после этого это работает и эквивалентно коду, показанному выше:
obj("foo") = "New value"
MsgBox obj("foo")
' As well as
obj!foo = "New value"
MsgBox obj!foo
' Or for more complex `name` entries (i.e. with invalid identifier symbols)
obj![foo] = "New value"
MsgBox obj![foo]
Обратите внимание, что вы должны добавить Attribute Value.VB_UserMemId = 0
в каком-либо другом редакторе, кроме редактора VBA, который поставляется вместе с Microsoft Office, поскольку по некоторым причинам он скрывает директивы Attribute
.экспортируйте модуль, откройте его в блокноте, добавьте директивы и импортируйте его обратно в редактор VBA.Пока вы не измените слишком много с элементом по умолчанию, директива не должна быть удалена (просто проверяйте время от времени проверку во внешнем редакторе).