Может ли кнопка панели быстрого доступа вызывать макрос из определенного проекта?
Следующие утверждения включают информацию из MSDN.
При вызове процедуры в VBA необходимо убедиться, что другой модуль в проекте не имеет процедуры с таким же именем. Если это так, вы должны указать модуль, чтобы убедиться, что вызывается правильная процедура, вот так.
Sub Main()
Module1.MyProcedure
End Sub
Теперь, если вы работаете с несколькими проектами, в которых есть процедуры с одинаковыми именами, вы должны указать не только модуль, но и проект - даже если модули имеют уникальные имена.
Sub Main()
[MyProject.dotm].[MyModule].Main
End Sub
У меня есть следующая конкретная ситуация. В моем нормальном.dotm, у меня есть процедура main
в модуле mod_x
, Я создал кнопку на панели быстрого доступа, чтобы вызвать эту процедуру напрямую. Работает нормально.
В моем myTemplate.dotm есть также процедура, которая называется main
в модуле mod_y
, Итак, когда я создаю документ на основе этого шаблона, я имею доступ к макросам из этого шаблона, а также из normal.dotm.
К сожалению, при нажатии кнопки на панели инструментов она неизменно вызывает главную функцию в mod_y
вместо использования правильной функции main из normal.dotm.
Можно ли изменить эту кнопку панели быстрого доступа, чтобы всегда вызывать правильную функцию из normal.dotm, а не другую?
1 ответ
Вы можете убедиться, что все применимые проекты ссылаются на вызывающий проект. Это упростит обращение к объектам каждого проекта, а также добавит возможность расставлять приоритеты для каждого проекта.
normal.dotm
шаблон уже должен отображаться в дереве браузера проекта:
Нажмите Инструменты → Ссылки, и мы должны найти
Normal
уже в списке - и "постоянно" проверено (включено).Нажмите Обзор... и измените раскрывающийся список типов файлов на Документы Word, чтобы явно ссылаться на один или несколько проектов из внешних документов.
Мы также можем установить приоритет каждого добавляемого проекта с помощью стрелок вверх / вниз. Это указывает порядок, в котором VBA проверяет ссылки при поиске именованной процедуры. Обратите внимание, что мы не можем переместить .DOCX
проект будет "выше" Normal
шаблон...
Однако через некоторое время мы найдем обходной путь, необходимый для того, чтобы мы могли обратиться к рассматриваемой внешней процедуре [с нашей панели инструментов], не вызывая ее явно.
Явные внешние звонки
У меня есть 4 подпрограммы названы mySub()
: два в отдельности docx
файл Module1
х, один в Module1
из Normal
и один в ThisWorkbook
из Normal
,
Каждый из них может быть вызван явно:
Project_in_Document1.Module1.mySub
Project_in_Document2.Module1.mySub
Normal.ThisDocument.mySub
Normal.Module1.mySub
Обходной путь: вызов внешнего сабвуфера, как если бы он был внутренним
В случае с вашей панелью инструментов она нам понадобится для вызова подпрограммы, например:
Project_in_Document2.Module1.mySub
... но мы можем обращаться к нему только с локальным именем процедуры (которое хочет "ближайшего" - которое находится в normal.dot
.)
Поэтому мы обманываем, добавляя еще одну процедуру с тем же именем, только "ближе" - как локальную процедуру в текущем модуле:
Sub mySub()
Project_in_Document2.Module1.mySub
End Sub
Теперь, когда мы (или панель инструментов) вызывает mySub
Excel направлен на предполагаемую процедуру.
(Нажмите на изображение, чтобы увеличить)
Заметки:
Мы не можем ссылаться на какие-либо частные процедуры извне, поэтому:
- Они не должны быть помечены как
Private Sub
(или жеPrivate Function
), а также, - Не должно быть декларации уровня модуля
Option Private
,
После того, как все соответствующие проекты упоминаются в диалоговом окне "Ссылки", появляется дополнительный бонус встроенных советов по определению в качестве напоминаний о правильном синтаксисе:
Я полагаю, это был бы лучший пример, если бы я использовал проект, который не является встроенным... но вы поняли идею!
Дополнительная информация и ссылки по теме:
- MSDN: Диалоговое окно "Ссылки" (VBA)
- Bently.com: процедура вызова в другом проекте [микростанция]
- VBForums: вызов подпроцедуры в другом VBAProject
- MSDN: устранение неисправностей сломанных ссылок
- Переполнение стека: повторно использовать (но не показывать) основные функции VBA (UDF) в разных проектах
- MSDN: перенос решений Word VBA в инструменты Visual Studio для Office
- MS Docs: Как: настроить панель быстрого доступа
- MSDN: Как: использовать VBA для добавления настраиваемой команды на ленту