Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вызвать процедуру из друго модуля?

248
25 августа 2009 года
Dmitry2064
590 / / 06.12.2006
Этот вопрос я уже задавал по Екселю, но в Ворде не получается:
Есть шаблон с именем Kraft.dot, в нем сидит модуль myWork, а в нем процедура Start001. Пробую запустить ее так:
 
Код:
Sub test_add_teml()
ActiveDocument.AttachedTemplate = "c:\Users\Fil\AppData\Roaming\Microsoft\Шаблоны\Kraft.dot"
Call Kraft.MyWork.Start001 [COLOR="DarkRed"]'пишет object required[/COLOR]
End Sub
275
26 августа 2009 года
pashulka
985 / / 19.09.2004
Касаемо предыдущего вопроса, есть ещё один, причём, универсальный вариант, а именно :

 
Код:
Application.Run Macro:="Лист1.GetDocuments" 'Run "Лист1.GetDocuments"


Если же существует вероятность изменения кодового(программного) имени рабочего листа (хотя, как правило, меняют просто имя), то :

 
Код:
Application.Run Macro:=Worksheets("Имя_рабочего_листа").CodeName & ".GetDocuments"

Run Worksheets(Индекс_рабочего_листа).CodeName & ".GetDocuments"


Обратите внимание на то, что в данном случае, процедура GetDocuments может быть личной, т.е. Private Sub GetDocuments()


Собственно метод Run наличествует и в MS Word, и если процедура Start001 общая, т.е. Sub Start001() = Public Sub Start001(), то :

 
Код:
ActiveDocument.AttachedTemplate = "C:\Users\Fil\AppData\Roaming\Microsoft\Шаблоны\Kraft.dot"

Application.Run MacroName:="Start001"

Application.Run "MyWork.Start001"



P.S. Возвращаясь к первому вопросу, использование инструкции Call не носит обязательного характера, поэтому Call Лист1.GetDocuments можно заменить на Лист1.GetDocuments
248
26 августа 2009 года
Dmitry2064
590 / / 06.12.2006
Call я оставляю, чтобы было легче найти "место запуска".
А проблема в том, что надо запустить макрос-процедуру не просто из другого модуля, а еще и из другого проекта, который подключается командой
ActiveDocument.AttachedTemplate = "C:\Users\Fil\AppData\Roaming\Microsoft\Шаблоны\Kraft.dot"

Изначально идея была разнести по разным проектам разные не связанные модули. А то размер Normal.dot/Project оч. большой получается. А в работе в конкретный момент используется только один модуль.

И вот при попытке запуска пишется, что [COLOR="DarkRed"]object required[/COLOR].

Т.е. можно ли в путь к процедуре подписатьне только модуль, но и проект. Вроде был какой-то вариант с восклицательным знаком в строке сложного пути?
275
26 августа 2009 года
pashulka
985 / / 19.09.2004
Какая-то надуманная проблема, ибо после того, как мы присоединили (а по сути открыли) шаблон документа, все Public макросы этого шаблона можно выполнить с помощью метода Run об'екта Application, причём без указания имени проекта и модуля.

P.S. Если очень хочется найти вариант с указанием полного пути, то для начала можно прочитать справку, касательно уже неоднократно упомянутого метода Run.
248
27 августа 2009 года
Dmitry2064
590 / / 06.12.2006
Да все заработало. Я просто пытался обойтись без Run. Т.к. у Run есть странная (или не странная) особенность. Если запускать в режиме отладки по F8, то после выполнения команды Run вызванная процедура выполняется целиком, а не пошагово, как в случае с Call и надо ее успеть поймать, пока "не наломала дров" :))
Да и в Help, действительно, все про путь написано (я мог бы и сразу посмотреть).
Большое спасибо за подсказку.
275
28 августа 2009 года
pashulka
985 / / 19.09.2004
Добиться пошаговой отладки процедуры, вызываемой с помощью метода Run, довольно легко, для этого достаточно всего лишь поместить в начало вызываемой процедуры инструкцию Stop. Естественно, после отладки, эту инструкцию нужно удалить/закомментировать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог