Excel-VBA - Есть ли что-то вроде контейнера Javas Set в VBA? - PullRequest
3 голосов
/ 20 января 2011

Есть ли что-нибудь похожее на Java Set-контейнер в VBA?Я ничего не могу найти, и Google, похоже, не помогает, так как set - это зарезервированная работа в VBA.Прямо сейчас мои единственные варианты - Словарь или Массив.

Спасибо.

1 Ответ

3 голосов
/ 20 января 2011

VBA имеет встроенный объект 'Collection', и многие люди считают объект 'Dictionary' из MS Scripting Runtime достаточно стандартным, чтобы он по сути являлся частью VBA.

Однако ни один из них не обеспечит уникальность для общих объектов. Можно ли заставить их применять уникальность для вашего приложения, зависит от деталей.

Например, если вам нужен набор строк, это легко. Просто используйте «Словарь» и используйте его ключи в качестве «набора». «Dictionary» имеет метод «Exists», поэтому было бы довольно легко написать свой собственный ограниченный класс «Set», в котором вся реальная работа выполняется с помощью «Dictionary». (Если вы используете Excel, это будет работать с любыми простыми значениями Variant - строками, числами, логическими значениями, ошибками.)

Если у вас есть экземпляры объектов, все может стать более сложным. Объект 'Dictionary' может использовать объекты в качестве ключей, но он использует идентичность объекта в качестве теста на равенство. Например, я просто набрал это в окне VBA Immediate:

set d=new Dictionary
set c1=new Collection
set c2=c1
d(c1) = 42
fv d
<Dictionary: keys: #V(0..0){<Collection: 0 elems: >}, items: #V(0..0){42%}>
d(c2)=99
fv d
<Dictionary: keys: #V(0..0){<Collection: 0 elems: >}, items: #V(0..0){99%}>
set c3=new Collection
d(c3)=101
fv d
<Dictionary: keys: #V(0..1){<Collection: 0 elems: >,<Collection: 0 elems: >}, items: #V(0..1){99%,101%}>

('fv' - это подпрограмма VBA, которую я использую для отладки - она ​​просто выводит строковое представление материала.) Вы можете видеть, что идентичные объекты обрабатываются как равные, но одинаково оцениваются объекты не являются ' т.

Если вам нужен набор, в котором есть пользовательский тест на равенство, вам нужно написать нетривиальный код. Тем не менее, если вы можете хотя бы записать отображение из экземпляра объекта в значение, которое можно использовать в качестве ключа словаря, вы все равно можете избежать написания своего собственного «эта вещь уже является членом набора?» код.

Некоторые релевантные ссылки:

Можно ли написать тест на равенство для класса VBA с закрытыми членами, не раскрывая знания о существовании этих закрытых членов?

Хеш-таблица / Ассоциативный массив в VBA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...