То, что вам нужно, может быть достигнуто путем создания пользовательской коллекции плюс свойство по умолчанию .
Вот основной скелет. Вы можете настроить эту коллекцию в соответствии со своими потребностями.
TV.cls
Public Name As String
Public Make As String
TVCollection.cls
Private m_Coll As Collection
Private Sub Class_Initialize()
Set m_Coll = New Collection
End Sub
Property Get Item(index) As TV
Set Item = m_Coll(index)
End Property
Public Function Add(varTV As TV)
m_Coll.Add Item:=varTV
End Function
Public Property Get Count() As Long
Count = m_Coll.Count
End Property
Тогда вы можете использовать эту коллекцию (с работающим IntelliSense):
Sub FFF()
Dim col As New TVCollection
Dim varTV As TV
Set varTV = New TV
varTV.Name = "Some TV"
col.Add varTV
MsgBox col.Item(1).Name '// "Some TV"
col.Item(1).Name = "Another TV"
MsgBox col.Item(1).Name '// "Another TV"
End Sub
Однако вы хотите написать col(1)
, а не col.Item(1)
. Для этого вам нужно вручную отредактировать файл .cls
, чтобы установить Item
свойство по умолчанию. Вот что вам нужно сделать:
1) Щелкните правой кнопкой мыши на модуле TVCollection
и нажмите Remove TVCollection
. В появившемся диалоговом окне выберите Yes
. Выберите место для сохранения.
2) Откройте класс сохранения TVCollection.cls
в текстовом редакторе и перейдите к строке Property Get Item(index) As TV
.
3) Теперь прямо под ним введите следующий код:
Property Get Item(index) As TV
Attribute Item.VB_UserMemId = 0
Set Item = m_Coll(index)
End Property
4) Сохраните изменения и импортируйте этот класс обратно в VBE: Файл -> Импорт файла ...
Теперь вы можете написать так, и IntelliSense будет работать нормально:
MsgBox col(1).Name
Здесь Вы можете скачать рабочую книгу с кодом.