Access 2007 中的 UI 自定义

Access 2007 中的功能区自定义与其他 Office 应用程序共享某些相同的选项,但存在一些重要的区别。正如其他 Office 2007 应用程序一样,使用 XML 标记来自定义 Access 功能区 UI。也可以使用包含 XML 标记或 COM 加载项的外部文件将功能区自定义集成到应用程序中,这也与其他应用程序类似。不过,与其他 Office 应用程序不同的是,因为 Access 数据库文件是二进制文件,不能作为 Office Open XML 格式文件打开,所以无法通过在数据库文件中添加部分来自定义 Access 功能区。

Access 在自定义功能区 UI 方面确实提供了极大的灵活性。例如,可将自定义标记存储在表中、将其嵌入某个 VBA 过程、将其存储在另一 Access 数据库中或将其链接到某个 Excel 工作表。还可以为整个应用程序或特定窗体和报告指定自定义 UI。

为让您了解自定义 Access UI 的过程有多么轻松,让我们通过几个应用场景进行预演。

注意 因为在进行这些预演的过程中要对数据库进行更改,所以您可能不希望在自己的数据库中执行这些步骤,而是希望在其他数据库(例如,Access 自带的 Northwind 示例数据库)中执行。

自定义 Access 功能区 UI

所有 Access UI 自定义都有一个共同点:只有通过调用唯一的功能区特定的 Access VBA 对象成员(LoadCustomUI 方法),它们所代表的功能区才能供应用程序使用。该方法的签名为:

expression.LoadCustomUI(CustomUIName As String, CustomUIXML As String)

其中 expression 返回一个 Application 对象

CustomUIName 是将与此标记关联的自定义功能区 ID 的名称

CustomUIXML 包含 XML 自定义标记。

通常,要创建功能区并使其可供应用程序使用,首先需要在数据库中创建一个模块,其中包含调用 LoadCustomUI 方法的过程,从而传入功能区的名称和 XML 自定义标记。如前所述,XML 标记可来自通过表创建的 Recordset 对象、来自数据库之外的来源(如必须解析为 String 的 XML 文件)或来自直接嵌入过程内部的 XML 标记。只要每个功能区的名称和组成功能区的选项卡的 id 属性是唯一的,就可通过对 LoadCustomUI 方法进行多次调用,传入不同的 XML 标记来使不同的功能区可用。

过程完成后,接着创建一个通过使用 RunCode 操作调用该过程的 AutoExec 宏。这样一来,应用程序启动时将自动执行 LoadCustomUI 方法,所有自定义功能区都可供应用程序使用。

在应用程序启动时应用自定义功能区

要实现自定义 UI 以便其在应用程序启动时可用,请执行下列操作:

1.

按之前所述过程操作,使自定义功能区可供应用程序使用。

2.

关闭应用程序,然后将其重新启动。

3.

单击“Microsoft Office 按钮”(“文件”菜单),然后单击“Access 选项”按钮。

4.

单击左侧窗格中的“启动”选项,然后在“应用程序选项”部分中单击“自定义功能区 ID”并选择列表中的其中一个功能区。

5.

现在,请关闭应用程序,然后将其重新启动。将显示所选 UI。

为窗体或报告指派自定义功能区

1.

按之前所述过程操作,使自定义功能区可供应用程序使用。

2.

在“设计”视图中打开窗体或报告。

3.

在“设计”选项卡上,单击“属性页”按钮。

4.

在“属性”窗口的“全部”选项卡上,单击“自定义功能区 ID”下拉列表,然后选择列表中的其中一个功能区。

5.

保存、关闭窗体或报告,然后将其重新打开。将显示所选 UI。

注意 显示在功能区 UI 中的选项卡是附加选项卡。也就是说,除非专门隐藏选项卡或将 startFromScratch 属性设置为 True,否则由窗体或报告的功能区 UI 显示的选项卡将是在现有选项卡基础上增加的选项卡。

为进一步说明此过程,我们来完成几个示例。

创建 Access 应用程序级别自定义功能区

下列步骤演示为数据库创建和实现自定义功能区的过程。

开始之前,需要设置一个选项来报告执行代码时可能发生的任何错误:

1.

单击“Microsoft Office 按钮”(“文件”菜单),单击“Access 选项”,然后单击“视图”选项卡。

2.

在“在所有 Office 应用程序中,显示”部分,选择选项“报告加载项中的自定义用户界面错误”。

接下来,创建一个包含自定义 XML 标记的表:

3.

启动 Access 2007。

4.

在“插入”选项卡上,单击“表”,然后单击“表设计”。

5.

在表中添加以下字段:

表 2. DbRibbons 表字段定义
字段名 类型

ID

Long Integer (AutoNumber)

RibbonName

Text

RibbonXml

Memo

6.

接下来,右键单击“Table1”选项卡,然后单击“数据表视图”。

7.

在创建的字段中添加下列数据:

表 3. DbRibbons 表数据
字段名

ID

(AutoNumber)

RibbonName

HideData

RibbonXml

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idMso="TabAccessEdit" visible="false" />
<tab id="dbCustomTab" label="自定义选项卡" visible="true">
<group id="dbCustomGroup" label="自定义组">
<control idMso="Paste" label="内置粘贴" enabled="true"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

此标记将 startfromScratch 属性设置为 False,然后隐藏内置的“编辑”选项卡。接下来,它会创建一个自定义选项卡和一个自定义组,并在该组中添加内置的 Paste 控件。

8.

将表保存为“DbRibbons”,然后将其关闭。

接下来,创建 VBA 模块和在启动时加载功能区的宏:

9.

在“插入”选项卡上,单击“高级”按钮,然后单击“模块”。

10.

在 Visual Basic 编辑器的“视图”菜单上,单击“属性窗口”。

11.

在“属性”窗口的“名称”属性文本框中,将模块的名称更改为“RibbonLoader”。

12.

在代码窗口中,插入下列 VBA 代码:

Option Compare DatabaseFunction LoadRibbons()Dim i As IntegerDim db As DAO.DatabaseSet db = Application.CurrentDb   For i = 0 To (db.TableDefs.Count - 1)   If (InStr(1, db.TableDefs(i).Name, "Ribbons")) Then      Dim rs As DAO.Recordset      Set rs = CurrentDb.OpenRecordset(db.TableDefs(i).Name)      rs.MoveFirst      While Not rs.EOF            Application.LoadCustomUI rs("RibbonName").Value, rs("RibbonXml").Value            rs.MoveNext      Wend      rs.Close      Set rs = Nothing   End IfNext idb.CloseSet db = NothingEnd Function

此代码根据任何名称中包含词语“Ribbons”的表创建一个 Recordset。然后它会调用 LoadCustomUI 方法来加载功能区,以使它们可供数据库使用。最后,它会关闭该记录集及对 DAO.Database 对象的引用。

13.

保存并关闭 Visual Basic 编辑器。

14.

在“数据库”窗口的“插入”选项卡上,单击“高级”,然后单击“宏”。

15.

在“宏”窗口中,添加下列操作:

操作:RunCode

函数名:LoadRibbons()

16.

右键单击“Macro1”选项卡,然后单击“保存”。

17.

在“另存为”对话框中,键入“AutoExec”。

18.

右键单击“AutoExec”选项卡,然后单击“关闭”。

19.

现在,请关闭数据库,然后将其重新启动。

20.

单击“Microsoft Office 按钮”,单击“Access 选项”,然后单击“启动”选项卡。

21.

在“应用程序选项”部分的“自定义功能区 ID”列表中,选择“HideData”。

22.

关闭数据库,然后将其重新启动。

请注意,功能区 UI 包括一个称为“自定义选项卡”的选项卡,其中包含一个带有“内置粘贴”按钮的组,称为“自定义组”。

.

图 3. Access 应用程序级别功能区 UI

现在总结一下该过程:数据库启动时将执行 AutoExec 宏,该宏调用 LoadRibbons 过程。LoadRibbons 程序根据 DBRibbons 表创建一个 Recordset 对象,然后调用 LoadCustomUI 方法,从而传递功能区的名称和 XML 自定义标记。关闭并重新启动应用程序后,HideData 功能区现已可供使用。接下来,将 HideData 功能区设置为应用程序启动时显示的功能区。最后,在关闭并重新启动应用程序后,将显示自定义功能区 UI。

为多个窗体创建 Access 自定义功能区 UI

在下列步骤中,将创建两个自定义功能区 UI 并为两个不同的窗体分配不同的 UI。也可对一个或多个报告执行同样的操作。执行这些步骤的前提是,已经完成了前面的过程,而且宏和模块已经存在。

首先,创建一个包含自定义 XML 标记的表:

1.

启动 Access 2007。

2.

在“插入”选项卡上,单击“表”按钮,然后单击“表设计”。

3.

在表格中添加以下字段:

表格 4. FormRibbons 表格字段定义
字段名 类型

ID

Long Integer (AutoNumber)

RibbonName

Text

RibbonXml

Memo

4.

接下来,右键单击“表1”,然后单击“数据表视图”。

5.

在创建的字段中添加下面两条记录和数据:

表格 5. FormRibbons 表格数据
字段名

ID

(AutoNumber)

RibbonName

HideInsert

RibbonXml

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idMso="TabCreate" visible="true" />
<tab id="frm1CustomTab" label="自定义窗体 1 选项卡" visible="true">
<group id="frm1CustomGroup" label="自定义组">
<control idMso="Paste" label="内置粘贴" enabled="true"/>
<control idMso="Copy" label="显示消息" /> </group>
</tab>
</tabs>
</ribbon>
</customUI>

ID

(AutoNumber)

RibbonName

HidePageLayout

RibbonXml

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idMso="TabPageLayout" visible="false" />
<tab id="frm2CustomTab" label="自定义窗体 2 选项卡" visible="true">
<group id="frm2CustomGroup" label="自定义组">
<button id="myButton" label="显示消息" enabled="true" onAction="MyButtonOnAction" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

与前一过程中的标记类似,此标记将 startfromScratch 属性设置为 False,然后隐藏内置选项卡。接下来,它会创建一个自定义选项卡和一个自定义组,将它们合为一体,然后将内置控件添加到该自定义组中。在另一标记中,在组中添加具有 OnAction 属性的自定义按钮,该属性会触发显示消息框的过程。

6.

将表保存为“FormRibbons”,然后将其关闭。

因为在前一过程中已编写了 LoadRibbons 过程,所以现在所要做的只是将由 onAction 属性调用的回调过程添加到“HidePageLayout”功能区中。

7.

打开“RibbonLoader”模块。

8.

在“工具”菜单上,单击“引用”,然后在“引用”对话框中滚动,直至看到“Microsoft Office 12.0 对象库”,然后单击该复选框。这样就可以访问 IRibbonControl 对象。

9.

在 LoadRibbons 过程下插入以下代码:

Sub MyButtonOnAction(ByVal control As IRibbonControl)   MsgBox ("您单击了" & control.Id)End Sub

10.

保存、关闭数据库,然后将其重新启动,以便新功能区可供应用程序使用。

现在需要创建未绑定窗体。确保创建窗体时未突出显示任何表,否则窗体将包含表中的所有字段。

11.

在“插入”选项卡上,单击“简单窗体”,然后单击“窗体设计”。

12.

在“设计”选项卡上,单击“属性页”。

13.

在“属性页”窗口中,滚动至看到“自定义功能区 ID”属性为止。

14.

单击列表,然后选择“HideInsert”功能区。

15.

关闭并将窗体保存为“Form_HideInsert”。

16.

现在,重复上述步骤,但这次在“自定义功能区 ID”属性中选择“HidePageLayout”功能区,并将窗体命名为“Form_HidePageLayout”。

17.

关闭数据库,然后将其重新启动。

18.

打开“HideInsert”窗体。请注意,现在功能区 UI 增加了一个“自定义窗体 1 选项卡”选项卡,其中包含一个称为“自定义组”的组,带有“粘贴”和“复制”内置按钮。

.

图 4. HideInsert 窗体的功能区 UI

19.

关闭该窗体,然后打开“HidePageLayout”窗体。现在,功能区 UI 将显示“自定义窗体 2 选项卡”选项卡,其中包含“自定义组”,带有“显示消息”自定义按钮。此外,将不显示内置“页面布局”选项卡。

.

图 5. HidePageLayout 窗体的功能区 UI

20.

现在,请打开“HideInsert”窗体。请注意,在窗体之间切换时,功能区 UI 将随所显示的窗体发生变化。

0 回复,0 引用: 如何自定义Access 2007 功能区(早期菜单工具栏)?

添加回复

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。