#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
являются объявлениями уровня модуля. Внутри aSub
у вас могут быть толькоDim
иConst
.4. Если вам нужно использовать словарь во всех существующих подразделениях или в более чем одном, вы объявите его на уровне модуля. Что-то вроде
Private test as Object
(удалите объявление из подраздела). Он работает без ссылки, не из-за того, что он был объявлен наSub
уровнях . Он работает, за которым следуетSet test = CreateObject("Scripting.Dictionary")
. Это означает позднюю привязку… Ранняя привязка позволяет просто объявлятьPrivate test As New Scripting.Dictionary
, и вы также получите выгоду от intellisense. Возможность видеть свойства объекта (метод, если таковой имеется) только при записи объекта…5. является ли ваш код обычным старым модулем? Или это в классе или другом типе модуля с кодированием?