为Access2007创建一个应用程序级的自定义Ribbon
(一) 创建一个 Access2007 应用程序级的自定义Ribbon
1、开启Access2007,打开一个已存在的数据库或创建一个新数据库。
2、单击“office按钮”,单击“Access选项”,然后单击“高级”选项卡。
3、在“常规”部分,选择选项“显示加载项用户接口错误”(在不同的应用程序中,该选项可能在不同的位置)。
4、单击“确定”关闭Access选项对话框。
接下来,创建一个包含自定义XML标记的表。
5、在Access2007中,右键单击导航窗格,单击“导航选项”,选中“显示系统对象”前的复选框。(除非设置了该选项,否则将不可能在导航窗格中查看USysRibbons表。)单击“确定”按钮,Access系统表将出现在导航窗格中。
6、在“创建”选项卡中,单击“表设计”。
7、在表中添加下面的字段。
表:在USysRibbons表中定义的字段
字段名称 数据类型
ID 自动编号
RibbonName 文本
RibbonXml 备注
8、选择ID字段,在“设计”选项卡中选择“主键”。
9、单击“Office按钮”,然后单击“保存”,将新表命名为USysRibbons。
10、右键单击USysRibbons选项卡,然后单击“数据表视图”。
11、添加下面的数据到所创建的字段中。
表:USysRibbons表数据
字段名称 值
ID (自动编号)
RibbonName HideData
RibbonXml Xml
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=”false”>
<tabs>
<tab idMso=”TabCreate” visible=”false” />
<tab id=”dbCustomTab” label=”A Custom Tab” visible=”true”>
<group id=”dbCustomGroup” label=”A Custom Group”>
<control idMso=”Paste” label=”Built-in Paste” enabled=”true”/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
这段标记设置startfromScratch属性为False,然后隐藏内置的“创建”选项卡。接着,创建一个自定义选项卡和自定义组,并将内置的粘贴控件添加到组中。
12、关闭该表。
13、关闭并重新打开数据库。
14、单击“Office 按钮”,然后单击“Access选项”。
15、单击“当前数据库”选项卡,向下滚动到“功能区和工具栏选项”部分。
16、在“功能区名称”下拉列表中,选择“HideData”,单击“确定”按钮。
17、关闭并重新打开该数据库。
此时,“创建”选项卡已不在功能区中,Fluent UI包括了“A Custom Tab”选项卡,其中包含“A Custom Group”组,带有内置的“粘贴”按钮。
18、要恢复功能区,则需要打开“Access选项”对话框,删除“功能区名称”选项中的内容,然后关闭并重新打开数据库,此时Access2007将显示其缺省的Fluent UI。
注意:也可以从USysRibbons表中使用一个功能区,为指定的窗体或报表提供UI。要进行这样的操作,在设计或布局模式下打开窗体或报表,然后设置窗体的RibbonName属性为想要使用的Ribbon的名称。在设置该属性之前,必须选择窗体自身,而不是窗体中的任何控件或选择。
(二) 在运行时装载定制
如果想在运行时装载静态的定制,则将这些定制存储在USysRibbons表中,并且在需要时设置窗体或报表的RibbonName属性。但是,如果需要创建动态的定制,则调用Application.LoadCustomUI方法。下面的示例创建一个Ribbon定制,显示应用程序中每个窗体的按钮,处理每个按钮的onAction回调来装载请求的窗体。
创建动态的Ribbon定制
1、将前面内容中所使用的数据库装载到Access 2007中。如果数据库中只有一个窗体,则创建一个新窗体并在每个窗体中添加一至两个控件。
2、在“创建”选项卡中的“其他”组中,单击“宏”按钮的下拉列表,然后单击“模块”。
3、在VBE中的菜单“视图”中,单击“属性窗口”。
4、在“属性”窗口中,将名称(Name)属性框中模块的名称改为RibbonLoader。
5、在代码窗口中,输入下面的代码。虽然该方法不会返回值,但必须是一个函数,否则不能够从Access宏中调用。
Function CreateFormButtons()
Dim xml As String
xml = _
“<customUI xmlns=”" http://schemas.microsoft.com/ ” & _
“office/2006/01/customui”">” & vbCrLf & _
“ <ribbon startFromScratch=”"false”">” & vbCrLf & _
“ <tabs>” & vbCrLf & _
“ <tab id=”"DemoTab”" label=”"LoadCustomUI Demo”">” & _
vbCrLf & _
“ <group id=”"loadFormsGroup”" label=”"Load Forms”">” & _
vbCrLf & _
“{0}” & vbCrLf & _
“ </group>” & vbCrLf & _
“ </tab>” & vbCrLf & _
“ </tabs>” & vbCrLf & _
“ </ribbon>” & vbCrLf & _
“</customUI>”
Dim template As String
template = “<button id=”"load{0}Button”" ” & _
“label=”"Load {0}”" onAction=”"HandleOnAction”" ” & _
“tag=”"{0}”"/>” & vbCrLf
Dim formContent As String
Dim frm As AccessObject
For Each frm In CurrentProject.AllForms
formContent = formContent & _
Replace(template, “{0}”, frm.Name)
Next frm
xml = Replace(xml, “{0}”, formContent)
Debug.Print xml
On Error Resume Next
‘ 如果从AutoExec宏中调用这段代码,
‘ 如果在USysRibbons表中有一个使用相同名称的定制
‘ 则会失败
Application.LoadCustomUI “FormNames”, xml
End Function
当运行该段代码时,如果应用程序中包含有名为Form1和Form2的两个窗体,则会创建像下面的XML的标记。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=”false”>
<tabs>
<tab id=”DemoTab” label=”LoadCustomUI Demo”>
<group id=”loadFormsGroup” label=”Load Forms”>
<button id=”loadForm2Button” label=”Load Form2″ onAction=”HandleOnAction” tag=”Form2″/>
<button id=”loadForm1Button” label=”Load Form1″ onAction=”HandleOnAction” tag=”Form1″/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
这段标记创建了一个新的LoadCustomUI Demo选项卡,包含有一个“Load Forms”组。在该组内,Ribbon为应用程序中的每个窗体(Form1和Form2)显示一个按钮,并指定每个按钮在单击时应该调用的HandleOnAction回调过程。此外,该标记为每个按钮设置Tag属性,以便于代码应该打开的包含的Access窗体的名称。
6、添加下面的代码到相同的模块中。该过程提供回调行为,打开所选窗体并设置其RibbonName属性到FormNames Ribbon定制。
Public Sub HandleOnAction(control As IRibbonControl)
‘ 装载指定的窗体
‘ 设置其RibbonName属性以便显示自定义UI.
DoCmd.OpenForm control.Tag
Forms(control.Tag).RibbonName = “FormNames”
End Sub
7、保存该数据库,关闭VBE。
8、如果应用程序只包含一个窗体,则创建窗体使得应用程序至少包含两个窗体。
9、确定应用程序的开启窗体,并且在设计视图中打开该窗体。
10、在属性窗口里的事件选项卡中,找到onLoad事件属性,单击属性值右侧的省略号(…)按钮,选择选项列表中的“代码生成器”,然后单击“确定”。(如果没有看到属性窗口,在设计选项卡中单击“属性表”。)
11、在VBE中,修改Form_Load过程,其代码如下所示。
Private Sub Form_Load()
CreateFormButtons
Me.RibbonName = “FormNames”
End Sub
12、在菜单“工具”中,单击“引用”,选择“Microsoft Office 12.0 Object Library”(需要对该对象库的引用来使用IRibbonControl类),然后单击“确定”。
13、保存该数据库,关闭VBE。
14、单击“Office按钮”,然后单击“Access选项”。
15、单击“当前数据库”选项卡。
16、在应用程序选项部分,从窗体的显示窗体列表中选择启动窗体,然后单击“确定”。
17、关闭并重新打开该数据库。
启动窗体打开,带有包含显示应用程序里每个窗体的按钮组的自定义选项卡。单击任何一个按钮,Access打开相应的窗体,保持相同的自定义UI。
除了已介绍的技术外,可以通过使用COM加载项添加 Ribbon定制 到Access2007中。COM加载项提供添加自定义RibbonX功能作为组件包的好处,而不需要在每个应用程序中添加VBA代码。在 Access2007 中执行加载项就像在其它Office应用程序中一样。
注意:虽然可以使用Visual Studio 2005共享加载项模板为Access创建一个COM加载项,但不能够使用 Visual Studio 2005 Tools for Office Second Edition来为Access创建COM加载项。Access是Visual Studio 2005 Tools for Office Second Edition不支持的应用程序之一。