為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>
這段標記創建了一個新的L