Ссылка на подкласс vba

В этом посте - описание использования «подкласса» в VBA. Я ищу следующий шаг: когда я добавляю первый подпункт, я хочу его использовать и не знаю, как это сделать.

Когда я пишу baseItem(1).itemName, он не работает.

Я предполагаю, что это просто потому, что этот baseItem не является коллекцией или массивом, но я не знаю другого пути.

1
0
859
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добро пожаловать в SO!

В vba, как и во многих других языках, это свойство. Вы вызываете их напрямую, а не численно, но вам нужно написать методы GET / LET, если класс не является общедоступным (на самом деле это не инкапсуляция для простого доступа напрямую).

baseItem.itemName будет вашим звонком.

Но ... Как я уже сказал, лучше писать аксессоры для своего класса как методы.

Вот парень, который задает тон ООП в VBA (для меня): https://stackoverflow.com/a/45570268/8716187

Он является водителем проекта Rubberduck.

Я бы попросил вас спросить себя, действительно ли вам нужен класс, я часто использую 4-10 словарей ключей, содержащих массивы. Я мог бы обернуть их в класс, но зачем? Мне нужен доступный для поиска и редактирования («массив» - словарь массивов).

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

-WWC

Поищите его ответы (Матье Гвидон) и также найдите Vitaya, есть и другие, вероятно, слишком многие, чтобы их здесь перечислить, но они активно направляют вас в том, как переводить части VBA в более «C-язык» или структуру ООП.

Wookies-Will-Code 10.08.2018 16:37

«Вот парень, который задает тон для ООП в VBA» - ~ румянец ~

Mathieu Guindon 10.08.2018 16:39
Ответ принят как подходящий

I assume it's just because that baseItem is not a collection or an array...

Сам baseItem не является коллекцией и не массивом. Это просто объект типа BaseClass. Но этот объект baseItem обертывает коллекцию, поэтому мы могли бы сказать, что это коллекция почти.

Проблема с этим объектом заключается в том, что, как он определен сейчас в ответ, который вы упомянули, он не предоставляет способа доступа клиентов к этой коллекции. Класс BaseClass необходимо изменить, чтобы он предоставил доступ в эту коллекцию внутренний для клиента этого класса. С доступ, например. Имеется в виду некоторая функция public, которая будет возвращать что-то из этой коллекции.

Добавьте к BaseClass что-то вроде этого:

Public Function getSubItem(index As Variant) As SubClass
    Set getSubItem = subClassCollection.Item(index)
End Function

Теперь объекты, которые будут созданы во время выполнения на основе этого определения класса, будут предоставлять доступ к коллекции внутренний через эту функцию getSubItem. Код, который будет использовать эту функцию, будет выглядеть так. Итак, теперь почти - это то, чего вы пытаетесь достичь.

Dim name As String
name = baseItem.getSubItem(1).itemName
Debug.Print name ' Prints "Something" in output window

Но это можно довести даже до того, чего вы пытаетесь достичь. При экспорте файла BaseClass.cls и добавлении Attribute Value.VB_UserMemId = 0 в самое начало функции getSubItem и повторном импорте его в проект.

Public Function getSubItem(index As Variant) As SubClass
    Attribute Value.VB_UserMemId = 0
    Set getSubItem = subClassCollection.Item(index)
End Function

Теперь вы действительно можете написать свой код именно так, как вы хотели. HTH

Dim name As String
name = baseItem(1).itemName
Debug.Print name ' Prints "Something" in output window

Для получения дополнительной информации о Creating A Default Member In VBA посмотрите, например, здесь.

Большой! Это работает, пока не знаю почему, но я продолжаю читать и ищу просветления;)

Wojciech Wiśniewski 27.08.2018 16:31

@ WojciechWiśniewski Я рад, что это помогло!

Daniel Dušek 27.08.2018 16:57

Другие вопросы по теме