Модуль VBA, который запускает другие модули - PullRequest
9 голосов
/ 28 марта 2012

Я программирую в Microsoft VBA.Сначала мне нужно сгенерировать QueryTable с помощью макроса (у меня есть код для этого), а после этого с помощью макросов мне нужно применить формулы, которые используют данные в QueryTable.Проблема, с которой я сталкиваюсь, заключается в том, что QueryTable появляется только после того, как Sub, в котором находится ее код, завершил работу.Это означает, что я не могу включить в него код, который генерирует формулы, потому что нет данных для формул, которые будут сгенерированы.

Идея сейчас состоит в том, чтобы написать модуль, который запускает другие модули:

Sub moduleController()
    Run "Module1"
    Run "Module2"
End Sub

Это выдает ошибку:

Ошибка времени выполнения 1004 - невозможно запустить макрос "macroname".Макрос может быть недоступен в этой книге или все макросы могут быть отключены.

Какое может быть решение?Может быть, есть другое решение для моей проблемы загрузки QueryTable?

Ответы [ 3 ]

17 голосов
/ 28 марта 2012

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

Так что если в Модуле 1 у вас былодва макроса Macro1 и Macro2 и в Module2 у вас были Macro3 и Macro 4, затем в другом макросе вы можете назвать их все:

Sub MasterMacro()
    Call Macro1
    Call Macro2
    Call Macro3
    Call Macro4
End Sub
3 голосов
/ 28 марта 2012

Является ли «Module1» частью той же книги, которая содержит «moduleController»?
Если нет, вы можете вызвать публичный метод «Module1», используя Application.Run someWorkbook.xlsm!methodOfModule.

1 голос
/ 25 октября 2014

Я только что узнал что-то новое благодаря Artiso. Я дал каждому модулю имя в окне свойств. Эти имена были также тем, что я объявил в модуле. Когда я пытался вызвать второй модуль, я получал сообщение об ошибке: Ошибка компиляции: ожидаемая переменная или процедура, а не модуль

Прочитав выше комментарий Artiso о том, что у меня нет одинаковых имен, я переименовал свой второй модуль, назвал его первым и проблема решена. Интересные вещи! Спасибо за информацию Artiso!

В случае, если мой опыт неясен:

Имя модуля: AllFSGroupsCY Public Sub AllFSGroupsCY ()

Имя модуля: AllFSGroupsPY Public Sub AllFSGroupsPY ()

Из AllFSGroupsCY ()

Public Sub FSGroupsCY()

    AllFSGroupsPY 'will error each time until the properties name is changed

End Sub
...