Как вызвать макрос с помощью кнопки и передать аргументы

Я хочу добавить кнопку на мой рабочий лист excel, который должен вызывать макрос, который может обрабатывать один ажимент (целочисленное значение). К сожалению, при создании кнопки я не могу связать какой-либо макрос с аргументами. Также просто набирать макрос и аргумент не работает.

Есть ли какое-либо простое решение передать аргумент макросу при нажатии кнопки?

Ответ 1

Да, вы можете назначить макрос кнопке (или другим элементам управления Excel/действиям в меню) и передавать ей постоянные или переменные аргументы.

В окне "Назначить макрос" (щелкните правой кнопкой мыши на объекте и выберите "Назначить макрос"):

  • Заключите имя макроса в одинарные кавычки, например, чтобы передать 2 константы: 'Button1_Click("A string!", 7)'
  • Выберите "This Workbook" для поля "Macros in"
  • Если вы хотите передать переменную (например, значение ячейки), заключите параметр в Evaluate()

Например, чтобы передать значение Sheet1!$A$1 функции кнопки, в поле "Macro name:" должен быть следующий текст:

Button1_Click(Evaluate("Sheet1!$A$1"))

Если вы не заключили аргумент переменной в функцию "Evaluate", Excel вернет ошибку "Формула слишком сложна, чтобы ее можно было присвоить объекту".

Я бы включил изображение, если бы это было разрешено в моем первом посте.

Ответ 2

Sub ert()
Call ert2(Cells(1,1).Value)
End Sub

Ответ 3

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

Private Sub CommandButton_Click()

  Dim x as Integer
  x = 1
  Call SomeSub(x)

End Sub

Ответ 4

Вызывается из обычной кнопки "формы" на листе, вы можете сделать что-то вроде этого:

Sub TestMe()
    Dim c, arr
    c = Application.Caller
    arr = Split(c, "_")
    If UBound(arr) > 0 Then MsgBox "Got " & arr(1)
End Sub

Если вызывающая кнопка названа (например) "Button_3"

Или (проще) щелкните правой кнопкой мыши и введите 'TestMe2 5' (включая одиночные кавычки)

Sub TestMe2(i)
    MsgBox "Got " & i
End Sub

Смотрите также: Excel 2010 - Ошибка: не удается запустить макрос SelectCell с помощью .onAction

Ответ 5

Чтобы вызвать этот Sub с помощью кнопки:

Public Sub TestButton(strMessage As String)
    MsgBox strMessage
End Sub

... имейте в виду, что Sub не будет указан в доступных макросах, потому что у него есть параметр. Просто введите вызов в одинарных кавычках: 'TestButton "Hello"'

Ответ 6

Предположим, у вас есть общедоступная подпрограмма, принимающая 1 аргумент, как показано ниже (только для пояснения.)

Macro

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

Button

Теперь вы можете ввести свое вспомогательное имя + пробел + аргумент вручную в одинарных кавычках, как показано ниже, нажмите кнопку ОК.

Type macro name

Тогда вы видите, проблема решена.

Result

Ответ 7

У меня были проблемы с моей версией Personal.xlsb! 'TestForXXXX ("Тестовый тест")'. Я получил ошибку при нажатии кнопки, содержащей макрос.

Тем не менее, я смог исправить это, удалив "(" и ")". Итак, Personal.xlsb! 'TestForXXXX "Test Test" "сработал (обратите внимание на пробел между testForXXXX и" Test... ").

На самом деле, мне не нужен Personal.xlsb! и только что смог использовать 'testForXXXX "Test Test"'.

Ответ 8

Я столкнулся с той же проблемой, когда assign button не очень полезен, пока не понял, что все потенциальные macros отображались только в файле Personal.xlsb, который не принимал аргументов. Затем я набрал Personal.xlsb!'macroNameWhichTakesArguments("arg1", ...)', и лист поднял его.

т.е. Personal.xlsb!'testForXXXX("Test Test")'

Где macro testForXXXX берет строку как входную, тогда лист работал нормально.

Когда вы используете маршрут макроса назначения для button in excel 2007, по крайней мере testForXXXX не будет отображаться в списке потенциальных макросов, если он принимает аргументы.

Я подозреваю, что Аарон С тоже сработал. Может быть, лучше не использовать файл Personal.xlsb?

Ответ 9

Я бы хотел прокомментировать ответ QA Collective, но у меня пока недостаточно репутации. Предыдущие решения не помогли мне, так как мои макросы находятся в именованных модулях в моем проекте VBA.

В Excel 2013 способ передать параметр в макрос с помощью кнопки, которая работала в моем контексте:

'<module name>.<macro name> <parameter>'

например

'DataProcessor.disle "myText"'

или же

'DataProcessor.editWSProcess True'

(логические значения не нуждаются в двойных кавычках при передаче в качестве параметров) Обратите внимание, что одинарные кавычки находятся вокруг всего выражения.