У меня есть два макроса в двух отдельных файлах .docm, и я хочу вызывать один из другого. Если я не передаю аргумент, то использование этого ...
Sub MySub()
RunStr = "'" & filePath & fileName & "' !HiStr"
Application.Run RunStr
End Sub
... отлично работает для запуска этого макроса, содержащегося в отдельном файле .docm ...
Sub HiStr()
Debug.Print "Hello" & aStr
End Sub
Но если я хочу передать аргумент из MySub в HiStr, например:
Sub MySub()
RunStr = "'" & filePath & fileName & "' !HiStr"
Application.Run RunStr, " World" ' <----- Argument passed
End Sub
внешнему макросу номер 2 с:
Sub HiStr(Optional aStr As String) ' <---- Accepting argument
Debug.Print "Hello" & aStr
End Sub
Я получаю RunTime Error '438 ': Объект не поддерживает это свойство или метод. FWIW, он запускает этот код из того же модуля, что и HiStr, работает нормально:
Sub InModule()
Application.Run "HiStr", " darkness, my old friend."
End Sub
Вещи пробовали, но не работают (не то, чтобы я ожидал, что многие из них):
- Не отправлять необязательный аргумент вообще (вместо этого я получаю сообщение об ошибке времени выполнения и «Невозможно запустить указанный макрос», хотя аргумент должен быть необязательным).
- Удаление
Optional
из аргумент make не является необязательным (та же ошибка 438, что и выше) - Добавление имени модуля между
!
и HiStr
(т. е. !Module1.HiStr
работает и отличается от указанного выше) - добавление
global aStr as String
вне подпрограммы (в объявлениях) в модуле HiStr - сохранение, закрытие и повторное открытие файлов
- избавление от одинарных кавычек вокруг имени файла (VBA не мог найти макрос вообще без них)
- заменив
!HiStr
на !HiStr(' World')
вместо того, чтобы попытаться передать аргумент (ошибка времени выполнения) - дословное копирование всего макроса внутри модуля HiStr sub ( сюжет сгущается, так что что-то не так с этим e использование
application.run "'filename\file.docm' !macro'"
против application.run "macro"
при передаче аргументов? Но что?) - документация (я не пробовал запускать это через Excel VBA, но подозреваю, что Application.Run работает так же)
- чтение всех остальных проблем используя Application.Run здесь