Excel-vba Application.Run альтернатива для запуска макроса с именованными аргументами - PullRequest
1 голос
/ 02 мая 2019

Как я могу использовать Application.Run с именованными аргументами?Основываясь на этой документации MS :

Вы не можете использовать именованные аргументы с этим методом.Аргументы должны передаваться по позиции.

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

Sub MyMacro()

    Dim macroName as String
    Dim foo as String
    Dim bar as String

    macroName = "'quux.xlam'!quuz"
    foo = "thud"
    bar = "baz"

    ' arguments pass by position
    ' this method works
    Application.Run macroName, foo, bar

    ' however, I intend to remove position dependency to allow flexibility
    ' hence, I'd like to pass argument by name, as below
    Application.Run macroName, foo:=foo, bar:=bar ' or below
    Application.Run macroName, bar:=bar, foo:=foo ' both raise compile error

End Sub


' Below is a macro from Add-In quux.xlam
Sub quuz(foo as String, bar as String)

    MsgBox foo & bar

End Sub

Мой вопрос похож на this , но там он не отвечает на мой вопрос.Так как же найти альтернативу для Application.Run?


Сценарии / предположения

У меня есть свой собственный макрос.В то же время я использую чужой макрос (например, из надстройки).У нас обоих нет связи и нет соответствующей документации для надстройки.Возможные сценарии приведены ниже (2):

  1. Код надстройки фиксирован

    • Я знаю, что должен передать foo и barно неизвестный порядок.Я не могу открыть код, потому что макрос защищен паролем, например.
  2. Мой код исправлен

    • Кто-то еще использует мой макрос.Они знают, что когда они используют мой макрос, они должны принять два аргумента foo и bar, но неизвестную позицию.
    • Мой макрос защищен паролем.
    • Этот случай проще, так какЯ могу, по крайней мере, внести свой вклад и создать надлежащую документацию.

Моя реальная ситуация больше касается номера 2, поэтому я думаю, что мое решение сейчас заключается в передаче аргументов по позициии создать соответствующую документацию для него.Но я просто проверяю ситуацию № 1, может, кто-то сталкивался с ней раньше или у вас есть идеи по ее решению?

1 Ответ

2 голосов
/ 02 мая 2019

Раствор 1

Вы можете написать себе процедуру-оболочку, которая сортирует переменные в правильном порядке.

Sub test()
    quuzWrapper bar:="bar", foo:="foo"
End Sub

Sub quuzWrapper(foo as String, bar as String)
    Application.Run "quuz", foo, bar 
End Sub



' Below is a macro from Add-In quux.xlam
Sub quuz(foo as String, bar as String)
    MsgBox foo & bar
End Sub

Раствор 2

  1. Убедитесь, что надстройка VBA имеет уникальное имя VBA и не называется VBAProject. Например, назовите это quuxAddIn.

  2. В вашем проекте (не надстройке) установите ссылку (в меню VB Editor: Дополнения> Ссылки) и выберите quuxAddIn.

  3. Тогда вы можете позвонить своему сабву, как:

    quuxAddIn.quuz bar:="bar", foo:="foo"
    

Редактировать из-за комментариев:
Если вы установили ссылку на проект, intelli sense (подсказка) должен работать, и после того, как вы ввели quuxAddIn.quuz, он должен показать подсказку с параметрами. Таким образом, вы также можете отправить параметры по имени. (Но на самом деле надстройка должна существовать, чтобы добавить ее в качестве ссылки, так что это только для вашего сценария 1). В случае вашего сценария 2 доступно только решение, которое вы описали и используете Application.Run с фиксированным заказом. • Тем не менее, хорошая документация должна быть обязательной.

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