VBA - Class Module - доступ к свойству по индексу - PullRequest
2 голосов
/ 28 октября 2019

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

Dim wks as new Workers
wks.add("Worker1")
wks.add("Worker2")
wks.add("Worker3")

Затем в модуле Workers Class:

Private Workers as Variant

Public Function add(ByVal val As Variant) As Long
  ReDim Preserve Workers(LBound(Workers) To UBound(Workers) + 1)
  Workers(UBound(Workers)) = val
  add = UBound(Workers) - LBound(Workers) +1
End Function

Workers representation -> {"Worker1", "Worker2", "Worker3"}

Затем я хочу получить доступ к Worker по его индексу. Я знаю, как получить к нему доступ, например, wks.getWorker (1) , но я хочу получить к нему прямой доступ с помощью wks (1) , который должен вернуть «Рабочий 1» . В приведенном выше примере показано, что можно использовать обычный массив или коллекцию, но у меня есть много внутренних методов, но мне не хватает только доступа к свойству Workers для чтения / записи напрямую по его индексу.

возможно?

Редактировать После передачи в Коллекции класс выглядит следующим образом:

Option Explicit

Private Workers As Collection

Private Sub Class_Initialize()
  Set Workers = New Collection
End Sub

Public Function add(ByVal val As Variant) As Long
  Workers.add val
End Function

Public Property Get Item(Index As Integer) As Variant
    Item = Workers(Index)
End Property

Public Property Set Item(Index As Integer, Value As Variant)
  Workers.Remove Index
  Workers.add Value, Before:=Index
End Property

со скрытыми атрибутами Атрибут Item.VB_UserMemId = 0 в Getterи Setter.

Начало работы отлично:

Dim wks As New Workers
wks.add "Worker1"
wks.add "Worker2"
wks.add "Worker3"
Debug.Print wks(2) ' <-- OK here
'wks(2) = "Second Worker" ' <-- By debugging this go to Getter not Setter and after Getter is done, it allerts with Runtime error '424': Object required
Set wks(2) = "Second Worker" ' <-- This alert immediately Compile error: Object required on "Second Worker" string
Debug.Print wks(2)

Печатает "Worker2" в консоли, спасибо за это, но все же я не могу установить новое значение для требуемого индексаРабочая коллекция.

1 Ответ

2 голосов
/ 28 октября 2019

Вы можете использовать элемент по умолчанию в VBA. Хотя вы не можете создать элемент по умолчанию непосредственно через редактор VBA, но вы можете использовать любой текстовый редактор.

  1. Экспортируйте свой класс из редактора VBA, например, Файл-> Экспорт файла
  2. Откройте экспортированный класс в Блокноте (или любом текстовом редакторе)
  3. Добавьте эту строку атрибута в свой метод или свойство, для которого вы хотите установить его по умолчанию. Attribute Item.VB_UserMemId = 0

Например, вы можете сделать элемент по умолчанию getWorker как.

Public Function GetWorker(Index As Integer) As Worker
Attribute Item.VB_UserMemId = 0
    GetWorker = Workers(Index)
End Function

, а затем использовать его как.

Set wk = wks(1)

Вот некоторыеподробности об элементах по умолчанию http://www.cpearson.com/excel/DefaultMember.aspx

Изменения

Пример, чтобы сделать Getter / Setter элементом по умолчанию

Public Property Get Item(Index as Integer) as Worker
Attribute Item.VB_UserMemId = 0
    Set Item = Workers(Index)
End Property

Public Property Set Item(Index as Integer, Value as Worker)
Attribute Item.VB_UserMemId = 0
    Set Workers(Index) = Value
End Property
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...