Public a как новый сценарий.Словарь в макро Word

#vba #dictionary #public

#vba #словарь #общедоступный

Вопрос:

У меня есть простой макрос Word в файловом проекте .DOTM. На самом деле не очень сложный. В основном это некоторые функции и

 Sub NameofSub(control As IRibbonControl) associated to Ribbon buttons.
  

Все в порядке, пока я не напишу

 Public test As New Scripting.Dictionary
  

в первых строках кода, вне какой-либо функции или подраздела. Выполнение этого приводит к тому, что все RibbonControls сообщают мне, что макрос недоступен. Думаю, это может быть связано с безопасностью???

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

Комментарии:

1. Вам нужна ссылка на «Microsoft Scripting Runtime` (в инструментах VBE — Ссылки …). Или используйте другой подход: Dim test as Object , тогда Set test = CreateObject("Scripting.Dictionary") . Поздняя или ранняя привязка (поздняя привязка для последнего)…

2. Спасибо за этот намек, но почему он работает без ссылки, если я использую его непосредственно внутри sub? Не должно ли это создавать проблемы, чем также? Итак, все работает нормально, если в подписи Dim установить Signature = CreateObject(«Scripting. Словарь») Подпись. Добавить «A», «test.RTF» находится внутри подраздела, но проблемы начинают перемещать объявление за пределы подраздела? Оооооооо, думаю, я вижу разницу… Мой код создает «Объект». Объявление «public» напрямую создает словарь… Я попытаюсь снять очки и снова протестировать…

3. Public И Private являются объявлениями уровня модуля. Внутри a Sub у вас могут быть только Dim и Const .

4. Если вам нужно использовать словарь во всех существующих подразделениях или в более чем одном, вы объявите его на уровне модуля. Что-то вроде Private test as Object (удалите объявление из подраздела). Он работает без ссылки, не из-за того, что он был объявлен на Sub уровнях . Он работает, за которым следует Set test = CreateObject("Scripting.Dictionary") . Это означает позднюю привязку… Ранняя привязка позволяет просто объявлять Private test As New Scripting.Dictionary , и вы также получите выгоду от intellisense. Возможность видеть свойства объекта (метод, если таковой имеется) только при записи объекта…

5. является ли ваш код обычным старым модулем? Или это в классе или другом типе модуля с кодированием?