Application.Run не передает аргумент макросу в другом шаблоне .docm, но работает в модуле VBA. - PullRequest
3 голосов
/ 01 августа 2020

У меня есть два макроса в двух отдельных файлах .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 здесь

1 Ответ

1 голос
/ 01 августа 2020

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

Конечно, предлагаемое там разрешение требует, чтобы другой документ был открыт. Однако, поскольку у вас есть полное имя и адрес этого документа, вы можете легко открывать его в фоновом режиме столько, сколько потребуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...