Ответ 1
Пожалуйста, смотрите таблицу ниже для полезного сравнения сборников и словарей.
(Таблица суммирует эту страницу до раздела "Раннее и позднее связывание". К вашему сведению, на странице также есть более подробная информация об использовании словарей)
Таким образом, лучше всего использовать словарь или массив.
При рассмотрении вопроса об использовании коллекций может быть более целесообразным использовать массив, если размер не изменяется или изменяется очень редко. В этом случае массив, вероятно, будет более эффективным, чем коллекция, так как массивы очень эффективны для заполнения и извлечения всех элементов одновременно (например, диапазон до массива и массив до диапазона).
Также обратите внимание:
По сравнению с массивами коллекции обеспечивают хорошую производительность для добавления и вставки элементов, а также для доступа к ним и их удаления с помощью их ключей. Тем не менее, производительность низка, если элементы должны быть доступны по индексу. Информацию о том, как сделать это эффективно, смотрите здесь, где также обсуждаются внутренние механизмы этих объектов списка.
Эта страница cpearson имеет очень полезный код для работы со словарями, коллекциями и массивами (сортировка их, а также преобразование их в друг друга!)
Немного текста со страницы cpearson:
Объект Collection и объект Dictionary очень полезны для хранения групп связанных данных. При прочих равных условиях я использую объект Dictionary, а не объект Collection, потому что у вас есть доступ (чтение, запись, изменение) к свойству Key, связанному с элементом в словаре. В довольно плохом объектном дизайне Ключ элемента в Коллекции только для записи. Вы можете назначить ключ для элемента, когда добавляете элемент в коллекцию, но вы не можете получить ключ, связанный с элементом, и не можете определить (напрямую), существует ли ключ в коллекции. Словари очень дружелюбны и открыты своими ключами. Словари также значительно быстрее, чем коллекции.
Почему массивы могут быть плохим выбором? Массивы значительно медленнее изменяют размеры и вставляют элементы посередине, поскольку каждый Redim копирует весь блок памяти в большее место, и, если используется Preserve, все значения также копируются. Это может привести к ощущению медлительности для каждой операции - в потенциальном приложении)
Коллекции против словарей в VBA
Feature | COLLECTION | DICTIONARY | Remark
------------------------+------------+------------+--------------------------------
Usually faster | | X |
------------------------+------------+------------+--------------------------------
Supported by VB Script | | X | Collections do not exist in VBS.
------------------------+------------+------------+--------------------------------
| | | Dicts: Add ref to Miscrosoft
Native to VBA | X | | Scripting Library. Usage:
| | | Dim MyDict As Scripting.Dictionary
| | | Set MyDict = New Scripting.Dictionary
------------------------+------------+------------+--------------------------------
Can change Keys and | | | Dict properties are writable.
Items | | X | For collections, remove the item
| | | and add a new item.
------------------------+------------+------------+--------------------------------
| | | A collection enumerates its items:
| | | For Each x In MyCollection
| | | Debug.Print x
Enumerated | X | X | Next x
| | | A dict enumerates its keys:
| | | For Each x In MyDictionary
| | | Debug.Print MyDictionary.Item(x)
| | | Next x
------------------------+------------+------------+--------------------------------
| | | A 1-d array of keys
Directly output to | | | and items can be returned by
array | | X | dict methods .Keys and .Items.
| | | (The array is zero-based even
| | | with Option Base 1.)
------------------------+------------+------------+--------------------------------
Retrieve and access | X | X |
items | | |
------------------------+------------+------------+--------------------------------
Add items | X | X |
------------------------+------------+------------+--------------------------------
Implicitly add items | | X | Dicts can implicitly add items
| | | using .Item property.
------------------------+------------+------------+--------------------------------
Remove items | X | X |
------------------------+------------+------------+--------------------------------
Remove all items in | | | With collections, each item must
one step | | X | be removed in turn, or the
| | | collection destroyed and recreated.
------------------------+------------+------------+--------------------------------
Count items | X | X |
------------------------+------------+------------+--------------------------------
Return item using key | X | X |
as lookup value | | |
------------------------+------------+------------+--------------------------------
Return item using | | |
ordinal position | X | (Slow) |
as lookup value | | |
------------------------+------------+------------+--------------------------------
Return ordinal | | |
position using item | X | ?? |
as lookup value | | |
------------------------+------------+------------+--------------------------------
Retrieve and access | | X | Collection keys only used to
keys | | | look up data, not retrievable.
------------------------+------------+------------+--------------------------------
Keys optional | X | | Big + of collections, assuming keys
| | | are not needed. (Access via index.)
------------------------+------------+------------+--------------------------------
Case sensitivity | | X |
optional | | |
------------------------+------------+------------+--------------------------------
| | | Collection keys must be strings.
Keys can be any type | | X | Dict keys can have any type
| | | (except arrays), incl. mixed types.
------------------------+------------+------------+--------------------------------
Keys must be unique | X | X |
------------------------+------------+------------+--------------------------------
| | | * For collections, add code:
| | | Public Function _
| | | Contains(col As Collection, _
Supports .Exists method | Remark* | X | key As Variant) As Boolean
| | | On Error Resume Next
| | | col(key)
| | | Contains = (Err.Number = 0)
------------------------+------------+------------+--------------------------------
Preserve key order when | | X | This is because collection keys
sorting by item value | | | are write-only, not read. Poor design!