回调,即使自定义界面能够工作的代码。如果没有回调,那么自定义界面可能看起来漂亮,但只是一个漂亮的功能区。当然,除内置控件不需要自定义回调外。
下面的内容介绍如何使用回调来提供自定义控件所需的功能。在编写XML代码时,需要指定回调,然后在Excel中编写VBA代码来匹配和处理回调。
回调概要
回调是自定义的用户界面使用的子过程和函数,使自定义的用户界面能够工作。回调简单地表现为所提供的指令的动向。例如,当设置某按钮的onAction属性并装载用户界面时,一旦单击该按钮,就产生回调,即在属性中指定的操作。
如果没有找到指定的操作,那么回调将失败,因为代码中发生了例外,即在属性中指定的回调在VBA中不存在,因此失败了。
自定义用户界面一装载就会调用VBA工程,搜寻指定的函数或过程。如果找到,则将其值传回到用户界面。如果没有找到指定的函数或过程,那么将产生错误的结果。
有两种主要的方式来创建回调:
n 直接在VBE的标准模块中输入过程或函数
n 使用工具生成过程,例如Office 2007 CustomUI Editor
使用诸如Office 2007 CustomUI Editor这类工具的主要优势是能够扫视XML代码并返回回调签名,也称作subprocedure stub,XML代码中每个属性都有一个需要处理的回调。接受回调作为值的属性包括onAction、getVisible和getImage。
除了节省时间外,使用CustomUI Editor还能避免由于手工编写回调签名而导致的拼写错误。上述每个属性都会产生一个不同的回调签名,必须按顺序使用代码处理,使用户界面有合适的功能。
此外,当工程装载时需要访问某些回调并运行,这意味着如果回调处理(即响应回调的VBA代码)在该工程中不存在,将产生错误消息。当然,下面的内容也会介绍如何缓解这类错误,甚至如何避免错误。
为动态回调建立文件
为了使自定义控件工作,文件必须启用宏,否则不能够添加或运行VBA代码。
1、捕获IRibbonUI对象
IRibbonUI对象引用功能区用户界面,用于控制事物如何响应。
在VBA中使用的关键之一是使整个Ribbon对象无效(因而能够改变功能区的某项特征)或者使功能区中指定的控件无效(因而能够改变该控件的某项特征)。
(1)调整XML以包括onLoad
为了使用IRibbonUI对象,需要在VBA中对其设置。首先,需要对UI的onLoad属性指定值,这能通过为onLoad属性指定回调来实现:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“ onLoad=“rxIRibbonUI_onLoad“>
因为onLoad属性的值是一个回调,所以需要在VBA代码中对其进行处理。接着,能够在工程中使用IRibbonUI对象。
(2)创建VBA代码处理onLoad事件
可能会注意到,前面将onLoad称作为属性,但现在将其称为事件。这是因为在XML文件中,能为许多属性定义值,例如onAction、getLabel和onLoad。一旦为某属性赋值,如果能以某种方式触发,将导致事件发生。这就是属性和事件的区别。
因为IRibbonUI对象用于整个应用程序,所以需要在标准模块的全局声明部分对其声明,如下面的代码所示。
‘全局的ribbon对象
Dim grxIRibbonUI As IRibbonUI
这里使用标准的格式grxIRibbonUI引用IRibbonUI对象,接着添加回调来设置该对象:
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
Set grxIRibbonUI = ribbon
End Sub
设置为全局对象之后,该对象可用于整个工程。然而,Ribbon对象对于修改是非常敏感的。这意味着任何时候修改代码,该对象实例将丢失并且任何需要Ribbon对象的操作都将失败。因此,无论何时作出修改,都需要保存、关闭并重新打开工程。
生成第一个回调
知道需要获得回调签名后,还需要知道如何使用回调签名。例如,对于切换按钮(toggleButton)有下列签名:
Sub rxtgl_click(control as IRibbonControl,pressed as boolean)
一个普通按钮的签名如下:
Sub rxbtn_click(control as IRibbonControl)
1、从头开始编写回调
如果知道了回调签名,则不必使用标准的形式声明参数。例如,有一个使用下列XML的切换按钮:
<toggleButton
id=”rxtgl”
label=”Toggle”
size=”large”
onAction=”rxtgl_click”
imageMso=”FormatPainter”/>
编写rxtgl_click回调如下:
Sub rxtgl_click(rxctl As IRibbonControl,toggled As Boolean)
If toggled Then
MsgBox “我已切换 …我的ID是 “ & rxctl.ID,vbInformation
End If
End Sub
注意到回调的参数名与上面介绍的标准的参数名不一样,但是单击切换按钮时仍触发该回调,像平常一样传递参数,因此签名中的修改不会导致过程失败,只要使用了正确类型的正确参数。
也能修改onLoad回调签名来满足需要,如下所示:
Sub rxIRibbonUI_onLoad(MyRibbon As IRibbonUI)
Set grxIRibbonUI=MyRibbon
End Sub
然而,如果使用标准的签名及其参数名称,那么其他人将更容易理解代码。下面列出了一些回调签名。
属性onLoad,回调签名(ribbon as IRibbonUI);
属性getLabel,getPressed,getEnabled,getImage,getScreentip,getVisible,等,回调签名(control as IRibbonControl,ByRef returnedVal);
属性onAction(切换按钮),回调签名(control as IRibbonControl,pressed as Boolean);
属性onAction(按钮),回调签名(control as IRibbonControl)。
2、使用Office CustomUI Editor生成回调
一种很容易生成回调的方法是使用CustomUI Editor。这个工具将所有的返回回调的属性搜寻在一起,然后生成需要的回调。因此,无须追踪XML中所有的回调。对于大段的XML代码来说,这是无价的。
在CustomUI Editor中(以Excel为例),可以使用下列步骤自动生成必需的回调:
步骤1 使用CustomUI Editor打开包含XML代码的Excel。
步骤2 单击“Generate Callbacks