powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / коллекции vba
3 сообщений из 3, страница 1 из 1
коллекции vba
    #36397242
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет :)
Вот понадобилось кое - чего написать для офиса.
А с vba я редко дело имею.

И вот, среди прочего, потребовалась мне коллекция, в которой можно хранить строки, и число их совпадений. При необходимости вытащить все ключи(строки), или все значения(количество совпадений), ну и тому подобное.
То - есть хранить объекты вот такой - вот структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
'KeyTimesItem Class

Private m_key As String
Private m_times As Integer

Private Sub Class_Initialize()
    Me.key = ""
    Me.times =  0 
End Sub

Property Get key() As String
    key = m_key
End Property

Property Let key(key As String)
    m_key = key
End Property

Property Get times() As Integer
    times = m_times
End Property

Property Let times(times As Integer)
    m_times = times
End Property

Public Sub incf()
    m_times = m_times +  1 
End Sub

И чего - то порылся я, ничего толком не нашел, кроме стандартной Collection
Ну, покряхтел, начал писать враппер над Collection:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
'KeyTimesItemCollection Class

Private m_items As Collection




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




Property Get all_items() As KeyTimesItem()

    Dim items() As KeyTimesItem
    Dim tmp As Variant
    Dim idx As Integer
    
    idx =  1 
    ReDim items( 1  To m_items.Count)
    
    For Each tmp In m_items
        Set items(idx) = tmp
        idx = idx +  1 
    Next tmp
    
    all_items = items
    
End Property




Property Get all_keys() As String()

    Dim keys() As String
    Dim item As Variant
    Dim idx As Integer
    
    ReDim keys( 1  To m_items.Count)
    
    idx =  1 

    For Each item In m_items
        keys(idx) = item.key
        idx = idx +  1 
    Next item
    
    all_keys = keys
    
End Property




Property Get all_times() As Integer()

    Dim times() As Integer
    Dim item As Variant
    Dim idx As Integer
    
    ReDim times( 1  To m_items.Count)
    
    idx =  1 

    For Each item In m_items
        times(idx) = item.times
        idx = idx +  1 
    Next item
    
    all_times = times
    
End Property




Public Function find_times_by_key(key As String) As Integer

    If (exist_item(key)) Then
        find_times_by_key = m_items(key).times
    Else
        find_times_by_key = - 1 
    End If
    
End Function



Public Function find_item_by_key(key As String) As KeyTimesItem

    If (exist_item(key)) Then
        Set find_item_by_key = m_items(key)
    Else
        Set find_item_by_key = Nothing
    End If
    
End Function




Public Function find_item_by_index(idx As Integer) As KeyTimesItem

    If ((idx >  0 ) And (idx <= m_items.Count)) Then
       Set find_item_by_index = m_items(idx)
    Else
        Set find_item_by_index = Nothing
    End If
    
End Function




Public Function add_if_not_exist(key As String) As Boolean

    If Not (exist_item(key)) Then
    
        Dim item As KeyTimesItem
        Set item = New KeyTimesItem
        
        item.key = key

        m_items.add item:=item, key:=key
        
        add_if_unique = True
    Else
        add_if_unique = False
    End If
    
End Function




Public Function exist_item(key As String) As Boolean

    Dim tmp As Variant
    
    For Each tmp In m_items
        If (tmp.key = key) Then
            exist_item = True
            Exit Function
        End If
    Next tmp
    
    exist_item = False
    
End Function




Property Get length() As Integer
    length = m_items.Count
End Property

Я его конечно щас допишу и заюзаю.
Но вот, может есть что - нибудь по универсальней Collection в ве бе а ?
Чтоб на будущее не изобретать велосипед?
...
Рейтинг: 0 / 0
коллекции vba
    #36397295
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
SQL_Lamer...
Я его конечно щас допишу и заюзаю.
Но вот, может есть что - нибудь по универсальней Collection в ве бе а ?
Чтоб на будущее не изобретать велосипед?

есть очень толковый объект - Dictionary
подключается через ...\system32\scrrun.dll
ну или надо будет так - CreateObject("Scripting.Dictionary")

в отличии от Collection - поддерживает групповые операции с элементами коллекции-словаря
ну т.е. -
удалить всё - .RemoveAll,
получить все ключи в массив - .Keys,
получить все значения в массив - .Items,
проверка существования ключа в словаре - .Exists
...в опщем - F1

по поводу
SQL_Lamer
При необходимости вытащить ... все значения( количество совпадений ),
в "ве бе а" - есть не менее "толковая" функция - Filter, возвращающая отфильтрованный по заданному критерию массив, из входного массива
...
Рейтинг: 0 / 0
коллекции vba
    #36397297
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
SQL_Lamer
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Function exist_item(key As String) As Boolean

    Dim tmp As Variant
    
    For Each tmp In m_items
        If (tmp.key = key) Then
            exist_item = True
            Exit Function
        End If
    Next tmp
    
    exist_item = False
    
End Function


в таких случаях, значительно проще (и быстрее) - попробывать получить значение
коллекции по ключу, и обработать ошибку если произошла
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / коллекции vba
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]