我想在我的excel工作表中添加一个按钮,它应该调用一个可以处理一个文件的宏(一个整数值)。遗憾的是,在创建按钮时,我无法链接任何具有参数的宏。也只是输入宏和参数不起作用。
是否有任何简单的解决方案可以在按下按钮时将参数传递给宏?
答案 0 :(得分:35)
是的,您可以为按钮(或其他Excel控件/菜单操作)分配宏,并将常量OR变量参数传递给它。
在“指定宏”窗口中(右键单击对象并选择“指定宏”):
'Button1_Click("A string!", 7)'
例如,要将Sheet1!$A$1
的值传递给按钮函数,您将在“宏名称:”字段中包含以下文本:
Button1_Click(Evaluate("Sheet1!$A$1"))
如果不使用“Evaluate”函数将变量参数括起来,excel将返回错误“公式太复杂而无法分配给对象。”。
如果我的第一篇文章允许,我会包含一张图片。
答案 1 :(得分:7)
Sub ert()
Call ert2(Cells(1,1).Value)
End Sub
答案 2 :(得分:3)
使用activeX控制命令按钮,在按钮单击方法中,调用sub并传递参数:
Private Sub CommandButton_Click()
Dim x as Integer
x = 1
Call SomeSub(x)
End Sub
答案 3 :(得分:3)
来自常规"形式"工作表上的按钮可以执行以下操作:
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 - Error: Cannot run the macro SelectCell using .onAction
答案 4 :(得分:1)
我的Personal.xlsb版本遇到了问题!'testForXXXX(“测试测试”)'。单击包含宏的按钮时出现错误。
但是,我能够通过删除“(”和“)”来修复它。所以,Personal.xlsb!'testForXXXX“Test Test”'工作了(注意testForXXXX和“Test ...”之间的空间。)
事实上,我不需要Personal.xlsb!并且只能使用'testForXXXX'测试测试''。
答案 5 :(得分:1)
从按钮调用此Sub:
car_maker = car_model.maker
...请注意,Sub不会列在可用的宏中,因为它有一个参数。只需使用单引号键入来电:Public Sub TestButton(strMessage As String)
MsgBox strMessage
End Sub
答案 6 :(得分:1)
假设您有一个如下所示的public sub take 1参数(仅出于解释目的。)
然后在如下所示的“工作表”上插入一个按钮,并且想要将子项分配给该按钮时找不到宏名称。
现在,您可以手动在单引号中输入子名称+空格+参数,如下所示,单击确定。
然后您看到了,问题解决了。
答案 7 :(得分:0)
我遇到同样的问题,assign button
没有用,直到我意识到显示的所有潜在macros
只是我 Personal.xlsb
文件中没有显示的内容参数即可。然后我输入了Personal.xlsb!'macroNameWhichTakesArguments("arg1", ...)'
,然后工作表就把它拿了起来。
即。 Personal.xlsb!'testForXXXX("Test Test")'
macro testForXXXX
将字符串作为输入,然后表单正常工作。
当您使用button in excel 2007
的分配宏路由至少testForXXXX
时,如果它采用args,则不会显示在潜在宏列表中。
我怀疑Aaron C也因此被绊倒了。也许最好不要使用Personal.xlsb
文件?
答案 8 :(得分:0)
我想评论一下QA Collective的答案,但我的信誉度还不够。以前的解决方案对我不起作用,因为我的宏位于我的VBA项目中的命名模块中。
在Excel 2013中,使用在我的上下文中有效的按钮将参数传递给宏的方法是:
'<module name>.<macro name> <parameter>'
例如
'DataProcessor.disle "myText"'
或
'DataProcessor.editWSProcess True'
(作为参数传递时,布尔值不需要双引号) 请注意,单引号用于整个表达式。