如何为Excel自定义功能区的多个EditBox设置不同文本?
问题根源
你遇到的问题核心在于两个EditBox共享了同一个全局变量TextInEditBox,而Ribbon控件的刷新是异步触发的。当你连续执行两次InvalidateControl时,第一次刷新editBox1的回调还未执行,全局变量就被修改为"2",导致两个控件的getText回调最终都读取到了最后一次设置的值。
解决方案
需要为每个EditBox单独存储文本值,并在回调中根据控件ID返回对应内容,步骤如下:
1. 替换全局变量为字典(或独立变量)
使用字典可以灵活管理多个控件的文本,避免单个变量的冲突:
Public myRibbon As IRibbonUI ' 用字典存储每个EditBox的文本,键为控件ID Public EditBoxTexts As Object ' 用Object避免引用Scripting Runtime Sub OpenFile(ribbon As IRibbonUI) Set myRibbon = ribbon ' 初始化字典,设置两个EditBox的默认空文本 Set EditBoxTexts = CreateObject("Scripting.Dictionary") EditBoxTexts("editBox1") = "" EditBoxTexts("editBox2") = "" End Sub
2. 修改MacroGetText回调
根据传入的控件ID,返回对应字典中的值:
Private Sub MacroGetText(control As IRibbonControl, ByRef text) ' 根据控件ID匹配对应的文本 text = EditBoxTexts(control.Id) End Sub
3. 修改测试宏
分别设置每个EditBox对应的字典值,再刷新控件:
Public Sub MyTest() EditBoxTexts("editBox1") = "1" myRibbon.InvalidateControl "editBox1" EditBoxTexts("editBox2") = "2" myRibbon.InvalidateControl "editBox2" End Sub
4. 修正XML结构(重要)
你的原XML存在语法错误:<tab>标签未闭合,且editBox必须放在<group>容器内,正确的XML结构如下:
<?xml version="1.0" encoding="utf-8"?> <customUI onLoad="OpenFile" xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="customTab" label="Exsem"> <group id="customGroup" label="Edit Boxes"> <editBox id="editBox1" getText="MacroGetText" /> <editBox id="editBox2" getText="MacroGetText" /> </group> </tab> </tabs> </ribbon> </customUI>
替代方案:使用独立全局变量
如果只有两个EditBox,也可以直接用两个独立变量,代码更简单:
Public myRibbon As IRibbonUI Public EditBox1Text As String Public EditBox2Text As String Sub OpenFile(ribbon As IRibbonUI) Set myRibbon = ribbon EditBox1Text = "" EditBox2Text = "" End Sub Private Sub MacroGetText(control As IRibbonControl, ByRef text) Select Case control.Id Case "editBox1" text = EditBox1Text Case "editBox2" text = EditBox2Text End Select End Sub Public Sub MyTest() EditBox1Text = "1" myRibbon.InvalidateControl "editBox1" EditBox2Text = "2" myRibbon.InvalidateControl "editBox2" End Sub
内容的提问来源于stack exchange,提问作者GSTK MONITORING
相关产品推荐
相关产品推荐

