Может ли кнопка быстрого доступа вызывать макрос из определенного проекта? - PullRequest
0 голосов
/ 20 мая 2018

Следующие утверждения включают информацию от MSDN .

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

Sub Main() 
Module1.MyProcedure 
End Sub

Теперь, если вы работаете с несколькими проектами, в которых есть процедуры с одинаковыми именами, вам нужно указать не только модуль, но и проект - даже если модули имеют уникальные имена.

Sub Main() 
    [MyProject.dotm].[MyModule].Main 
End Sub

У меня следующая специфическая ситуация.В моем normal.dotm у меня есть процедура main в модуле mod_x.Я создал кнопку на панели быстрого доступа, чтобы вызвать эту процедуру напрямую.Работает нормально.

В моем myTemplate.dotm также есть процедура с именем main в модуле mod_y.Поэтому, когда я создаю документ на основе этого шаблона, у меня есть доступ к макросам из этого шаблона, а также из normal.dotm.

К сожалению, при нажатии кнопки на панели инструментов он неизменно вызываетmain-function в mod_y вместо использования правильной main-функции из normal.dotm.

Можно ли изменить эту кнопку панели быстрого доступа, чтобы всегда вызывать правильную функцию из normal.dotm, а не другую?

1 Ответ

0 голосов
/ 20 мая 2018

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

Шаблон 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 направляетсяк намеченной процедуре.

image image
(Нажмите для увеличения изображения)


Примечания:

Мы можем не ссылаться на любые Частные процедуры из внешнего местоположения, поэтому:

  • Они должны не быть помечены как Private Sub (или Private Function) и
  • Должно , а не быть декларацией на уровне модуля Option Private.

Как только все соответствующие проекты упоминаются в диалоговом окне «Ссылки», появляется дополнительный бонус.советов по встроенному определению в качестве напоминаний о правильном синтаксисе:

image

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


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

...