Может ли кнопка панели быстрого доступа вызывать макрос из определенного проекта?

Следующие утверждения включают информацию из 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 шаблон уже должен отображаться в дереве браузера проекта:

IMG

  • Нажмите ИнструментыСсылки, и мы должны найти Normal уже в списке - и "постоянно" проверено (включено).

  • Нажмите Обзор... и измените раскрывающийся список типов файлов на Документы Word, чтобы явно ссылаться на один или несколько проектов из внешних документов.

    IMG

Мы также можем установить приоритет каждого добавляемого проекта с помощью стрелок вверх / вниз. Это указывает порядок, в котором 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,

После того, как все соответствующие проекты упоминаются в диалоговом окне "Ссылки", появляется дополнительный бонус встроенных советов по определению в качестве напоминаний о правильном синтаксисе:

Я полагаю, это был бы лучший пример, если бы я использовал проект, который не является встроенным... но вы поняли идею!


Дополнительная информация и ссылки по теме:

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