Как вызвать макрос с помощью кнопки и передать аргументы
Я хочу добавить кнопку на мой рабочий лист 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'
(логические значения не нуждаются в двойных кавычках при передаче в качестве параметров) Обратите внимание, что одинарные кавычки находятся вокруг всего выражения.