从自定义功能区编辑框读取值的问题求助
从自定义功能区编辑框读取值的问题求助
嘿,我来帮你捋捋问题出在哪~
你现在碰到的「参数不可选」错误,核心原因是你手动调用了ribbon的回调函数getValue,但这类回调是Office在特定时机自动触发的,根本不是给你直接调用的。而且你还搞混了getText回调的作用:它是Office向你的VBA请求「这个编辑框该显示什么文本」,不是用来获取用户输入内容的。
问题拆解
- 你写的
getValue是editBox的getText回调,当ribbon加载或者需要刷新编辑框显示内容时,Office会自动传入control和text参数调用它,你手动调用时没传参数,自然会报错。 - 就算你强行传了参数,这个函数的作用是把你指定的文本传给编辑框显示,根本拿不到用户输入的内容。
正确解决方法
最直接的方式是用editBox的onChange回调——当用户在编辑框里输入或修改内容时,这个回调会自动触发,你可以在里面实时保存用户输入的值,按钮点击时直接用这个值就行。
第一步:修改XML代码
给editBox加上onChange属性,同时可以加上onLoad回调保存ribbon实例(方便后续刷新控件):
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="ribbon_Load"> <ribbon startFromScratch="false"> <tabs> <tab id="CustomTab" label="My Tab"> <group id="SimpleControls" label="My Group"> <button id="Button1" imageMso="HappyFace" size="large" label="Large Button" screentip="my long description" onAction="MyMacro"/> <editBox id="valueInput" label="Value" getText="getValue" onChange="editBox_Changed" screentip="A test control!."/> </group> </tab> </tabs> </ribbon> </customUI>
第二步:修改VBA代码
Option Explicit Public tmpVal As String Public myRibbon As IRibbonUI ' 保存ribbon实例,后续刷新控件会用到 ' ribbon加载时触发,保存实例 Public Sub ribbon_Load(ByVal ribbon As IRibbonUI) Set myRibbon = ribbon tmpVal = "默认值" ' 可以给编辑框设置初始显示内容 End Sub Public Function MyMacro(ByRef control As Office.IRibbonControl) As Long MsgBox tmpVal ' 直接用实时更新的变量就行 MyMacro = 1 End Function ' getText回调:给编辑框设置要显示的内容 Public Sub getValue(ByRef control As Office.IRibbonControl, ByRef text As String) text = tmpVal ' 把变量的值传给编辑框显示 End Sub ' onChange回调:用户修改编辑框内容时,实时更新变量 Public Sub editBox_Changed(ByVal control As IRibbonControl, ByVal text As String) tmpVal = text ' 把用户输入的内容保存到全局变量 End Sub
为什么这样可行?
onChange回调会在用户每一次修改编辑框内容时自动触发,把当前输入的文本传给你的VBA,你只需要把它存到全局变量里就行。- 按钮点击时,直接读取这个全局变量,就能拿到用户最新的输入值,完全不需要手动调用回调函数。
以后记住:ribbon的回调函数都是Office主动调用的,你只需要实现逻辑,不要自己去调用它们~
备注:内容来源于stack exchange,提问作者Rational Redneck
相关产品推荐
相关产品推荐

