Есть ли техническая причина, по которой я не могу объявить открытый массив в классе VBA?

Я только что обнаружил, что, по-видимому, невозможно объявить открытый массив в классе VBA, хотя можно объявить его закрытым.

Мне интересно, если это имеет техническую причину или это выбор дизайна со стороны Microsoft.

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

С другой стороны, я не понимаю, почему не должно быть возможности объявлять публичные массивы, хотя вполне нормально объявлять публичные целые числа или другие типы данных.

Я был бы признателен, если бы кто-то мог объяснить рациональное, стоящее за всем этим.

1 ответ

Я считаю, что вам нужно спросить тех, кто создал язык программирования Visual Basic (или, может быть, даже Basic), "почему". Кажется, это присуще языкам. Что касается VBA, ограничение исходит от VB6, на котором базируется VBA. Я нахожу эту ссылку в поиске Google:

Объявление данных как открытых в форме означает, что вы создаете свойство для этой формы, используя сокращенный синтаксис. Свойство не может быть массивом, использующим этот синтаксис ярлыка.

Другими словами, "Public" означает "глобальный" только для устаревших статических (BAS) модулей. Для всего остального Public означает нечто совершенно иное.

И это:

Вместо массивов вы можете использовать объект Collection или свой собственный класс Collection. VB6 не позволяет объявлять константы, массивы, определяемые пользователем типы как открытые.

Из раздела справки VBA константы, строки фиксированной длины, массивы, определяемые пользователем типы и операторы Declare не допускаются как открытые члены объектного модуля.

Не все переменные в объектном модуле могут быть объявлены как Public. Тем не менее, процедуры являются открытыми по умолчанию, и процедуры Property могут использоваться для синтаксического моделирования переменных. Эта ошибка имеет следующие причины и решения:

Что касается массивов, в частности,

Вы объявили открытый массив в объектном модуле. Хотя процедура не может вернуть массив, она может вернуть вариант, содержащий массив. Для имитации массива Public в модуле класса используйте набор процедур Property, которые принимают и возвращают вариант, содержащий массив.

Другие вопросы по тегам