Подтвердить что ты не робот

Зачем использовать массивы в VBA, когда есть коллекции?

многие люди используют массивы массивов в Excel/VBA для хранения списка данных. Тем не менее, есть объект коллекции, который, на мой взгляд, МНОГО БОЛЬШЕ более удобен (в основном: не нужно повторно определять длину списка).

Итак, я искренне спрашиваю себя, не хватает ли чего-то? Почему другие люди все еще используют массивы для хранения списка данных? Это просто похмелье прошлого?

4b9b3361

Ответ 1

Несколько причин использовать массивы вместо коллекций (или словарей):

  • вы можете легко передать массив в диапазон (и наоборот) с помощью Range("A1:B12") = MyArray Коллекции
  • могут хранить только уникальные ключи, тогда как массивы могут хранить любое значение
  • коллекции должны хранить пару (ключ, значение), тогда как вы можете хранить все в массиве

Смотрите статью Chip Pearson о массивах для лучшего понимания

Лучше спросить, почему люди будут использовать коллекции над словарями (ok, коллекции являются стандартными VBA, тогда как вам нужно импортировать словари)

Ответ 2

@CharlesWilliams ответ правильный: цикл через все значения массива быстрее, чем повторение коллекции или словаря: настолько, что я всегда использую метод Keys() или Items() словаря, когда мне нужно сделайте это - оба метода возвращают векторный массив.

Примечание. Я использую класс Dictionary гораздо больше, чем использование коллекций, метод Exists() слишком полезен.

Есть или, конечно, недостатки в сборниках и словарях. Один из них состоит в том, что массивы могут быть 2- или даже 3-мерными - намного лучшая структура данных для табличных данных. Вы можете хранить массивы как члены коллекции, но есть некоторые недостатки: один из них заключается в том, что вы не можете получать ссылку на элемент - если вы не используете arrItem = MyDictionary (strKey), вы почти наверняка получит "ByVal" копию массива; это плохо, если ваши данные динамичны и могут быть изменены несколькими процессами. Это также медленно: много выделения и освобождения.

Хуже всего то, что я не доверяю VBA, чтобы освободить память, если у меня есть коллекция или словарь с массивами (или объектами!) в качестве элементов: не из-за пределов области, а не из Set objCollection = Nothing, даже не objDictionary.RemoveAll - трудно доказать, что проблема существует с ограниченным набором инструментов тестирования, доступным в VBE, но я видел достаточно утечек памяти в приложениях, которые использовали массивы в словарях, чтобы знать, что вам нужно быть осторожным. При этом я никогда не использую массив без команды Erase.

@JMax объяснил другой большой плюс для массивов: вы можете заполнить массив в одном "ударе" на листе и записать свою работу в один "хит".

Вы можете, конечно, получить лучшее из обоих миров, построив класс Indexed Array: двумерный массив со связанными объектами коллекции или словаря, хранящий какой-то идентификатор строки в качестве ключей, и порядковые числа строк в качестве данных Предметы.

Ответ 3

Коллекции, которые автоматически изменяют размер, медленнее (теоретически разные реализации, очевидно, будут иметь свой собственный пробег). Если вы знаете, что у вас есть определенное количество записей, и вам нужно только получить к ним доступ линейным способом, тогда традиционный массив будет правильным.