Visio VBA CustomUI Ribbon EditBox设置默认值异常问题求助
Visio自定义Ribbon EditBox默认值设置问题解决方案
问题根源
- getText回调内触发死循环+空对象调用报错:你在
BOM_getText中调用MyRibbon.InvalidateControl("BOMLink"),该方法会重新触发getText回调形成死循环;同时由于CustomRibbonOnLoad未执行,MyRibbon未初始化是空对象,调用其方法直接抛出0x80020009错误,导致returnedVal的赋值未生效。 - onLoad回调未触发:CustomUI XML中onLoad属性未指定回调所在模块,Office无法找到对应函数,导致
MyRibbon始终未被赋值。 - 回调参数类型未明确:getText的
returnedVal参数未显式指定为String,可能存在类型匹配问题。
修复步骤
第一步:修改CustomUI XML代码
补全onLoad回调的模块路径即可,完整代码如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="ThisDocument.CustomRibbonOnLoad"> <ribbon> <tabs> <tab id="CustomTab1" label="My Tab"> <group id="BOMGroup" label="BOM" autoScale="true" > <editBox id="BOMLink" label="BOM Link:" onChange="ThisDocument.BOMLink_onChange" getText = "ThisDocument.BOM_getText"/> <button id="GoToBOMLink" label="Go To BOM Link" screentip="Opens Browser to go to BOM Link" size="large" imageMso="HyperlinkOpenExcel" onAction="ThisDocument.OpenBOM" /> </group> </tab> </tabs> </ribbon> </customUI>
第二步:修改VBA代码(所有代码需放在ThisDocument模块内)
删除getText内的无效Invalidate调用、明确参数类型,完整代码如下:
Dim MyRibbon As IRibbonUI Sub CustomRibbonOnLoad(ribbon As IRibbonUI) Set MyRibbon = ribbon Debug.Print "CustomRibbonOnLoad called" ' 此处可保留也可删除,Ribbon加载时会自动调用一次getText MyRibbon.InvalidateControl "BOMLink" End Sub ' 后续修改Shapesheet值后需要动态更新EditBox显示时,调用此方法即可 Sub UpdateBOMLinkDisplay() If Not MyRibbon Is Nothing Then MyRibbon.InvalidateControl "BOMLink" End If End Sub 'Callback for BOMLink onChange Sub BOMLink_onChange(control As IRibbonControl, text As String) ' 可在此处添加逻辑把用户输入的内容保存到Shapesheet End Sub 'Callback for BOMLink getText Sub BOM_getText(control As IRibbonControl, ByRef returnedVal As String) Debug.Print "Callback UpdateBOMLinkText" ' 后续直接替换为从Shapesheet读取对应值的逻辑即可 returnedVal = "test default text" End Sub 'Callback for GoToBOMLink onAction Sub OpenBOM(control As IRibbonControl) Debug.Print "Callback OpenBOM" End Sub
验证方法
保存修改后的Visio模板文件,关闭后重新打开:
- 查看VBA立即窗口,会先输出
CustomRibbonOnLoad called,再输出Callback UpdateBOMLinkText,无报错 - 切换到自定义的"My Tab"标签,EditBox会直接显示"test default text"
内容的提问来源于stack exchange,提问作者adang
相关产品推荐
相关产品推荐

