运行时更新控件 回调不只是用于在装载工作簿时获取控件的属性,也可以使用它们在任何时间改变属性的值。这可通过使用指定的接口(IRibbonUI)标识一个控件为无效来实现,下次Excel需要显示该控件时,将再次调用所有回调来获取最新值。 通过添加onLoad回调到custom元素中,告诉Excel提供一个IRibbon接口: <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:Q="Excel 2007 VBA Prog Ref" onLoad="rxcustomUI_onLoad"> onLoad回调标记包括一个IRibbon参数,存储在一个模块级变量中供以后使用: Dim moRibbon As IRibbonUI Sub rxcustomUI_onLoad(ribbon As IRibbonUI) Set moRibbon = ribbon End Sub IRibbonUI接口仅有两个方法: (1) InvalidateControl(“ControlID”)方法标记一个单独的控件无效,因此当该控件下次显示时应该被更新。通常,使控件无效是最好的。 (2) Invalidate方法标记整个Ribbon定制无效,因此,每个控件的每次回调都被重新调用。这可能在提供UI语言选择和为每个控件使用getLabel时使用,当用户改变他们的语言选择时,使每个控件无效,因此更新时显示新的文本。 作为一个例子,下面的XML创建一个带有Up、Goto和Down菜单的splitButton,使用了内置的图像,并定义回调可以改变按钮的图像和行为以重复最后所选择的菜单(像Border splitButton)。创建一个新的工作簿,作为加载项保存该工作簿,然后使用自定义UI编辑器添加XML: <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="rxcustomUI_onLoad"> <ribbon> <tabs> <tab id="rxExcelVBA" label="VBA Prog Ref"> <group id="rxDemo" label="Demo"> <splitButton id="rxSplit" size="large"> <button id="rxButton" getImage="rxButton_getImage" onAction="rxButton_onAction" /> <menu id="rxMenu"> <button id="rxMenuOutlineMoveUp" label="Up" imageMso="OutlineMoveUp" onAction="rxMenu_onAction" /> <button id="rxMenuGoTo" label="Goto" imageMso="GoTo" onAction="rxMenu_onAction" /> <button id="rxMenuOutlineMoveDown" label="Down" imageMso="OutlineMoveDown" onAction="rxMenu_onAction" /> </menu> </splitButton> </group> </tab> </tabs> </ribbon> </customUI> 现在,打开上面创建的加载项(忽略任何错误),然后添加下面的VBA代码到标准模块中,执行定义在XML中的所有回调: '使控件无效的变量 Dim moRibbon As IRibbonUI '存储当前splitButton样式的变量,与图像名相同 Dim msSplitStyle As String 'customUI.onLoad回调 Sub rxcustomUI_onLoad(ribbon As IRibbonUI) Set moRibbon = ribbon End Sub 'rxButton getImage回调 Sub rxButton_getImage(control As IRibbonControl, ByRef returnedVal) 'GoTo缺省样式 If msSplitStyle = "" Then msSplitStyle = "GoTo" '返回内置图像名 returnedVal = msSplitStyle End Sub 'rxButton onAction回调 Sub rxButton_onAction(control As IRibbonControl) DoSplitAction msSplitStyle End Sub '所有rxMenu onAction回调 Sub rxMenu_onAction(control As IRibbonControl) '从控件ID中获取样式 msSplitStyle = Mid$(control.ID, 7) '告诉ribbon按钮需要被刷新 moRibbon.InvalidateControl "rxButton" '执行合适的操作 DoSplitAction msSplitStyle End Sub '执行操作 Private Sub DoSplitAction(ByVal sStyle As String) Select Case sStyle Case "OutlineMoveUp": MsgBox "向上" Case "GoTo": MsgBox "定位到" Case "OutlineMoveDown": MsgBox "向下" End Select End Sub 保存并关闭该加载项工作簿,然后重新打开该工作簿,此时应该有一个名为VBA Prog Ref的选项卡,带有一个单独的大的分割按钮,按钮上的图像和动作变化与所选菜单相匹配。
图4
|