Access 2007 手动加载功能区(答LeeTien)
LeeTien 写了这样一函数来加载功能区:
Public Function LoadRibbons()
'Load ribbons into the database
On Error GoTo Error1
Dim db As DAO.Database
Set db = Application.CurrentDb
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("tblRibbon")
' tblRibbon has to be replaced by your table name.
Do Until rs.EOF
Application.LoadCustomUI _
rs("RibbonName").Value, rs("RibbonXML").Value
rs.MoveNext
Loop
Error1_Exit:
On Error Resume Next
rs.Close
Set rs = Nothing
Set db = Nothing
Exit Function
Error1:
Select Case Err
Case 32609
' Ribbon already loaded
Case Else
MsgBox "Error: " & Err.Number & vbCrLf & _
Err.Description, vbCritical, _
"Error", Err.HelpFile, Err.HelpContext
End Select
Resume Error1_Exit
End Function
可是:
他把它放在启动窗体的加载事件里:
Sub Form_Load()
Call CreateRibbon
End Sub
来加载,当打开启动窗体时,并没有出错提示,但也看不到自定义功能区!
这是什么原因呢?
原因在于:
Access 2007在显示功能区之前首先要加载功能区。
比如窗体的功能区,我们必须在加载窗体之前加载功能区的XML,然后,指定这个窗体的功能区属性为这个功能区的名称,那么,打开这个窗体的时候,就会显示这个功能区,关闭这个窗体,那么这个功能区也会随之关闭,但是,功能区并没有从内存去除,因此,当第二次再打开这个窗体的时候,不需要再加载这个功能区就能显示功能区,反之,则程序出错。
而对于全局的功能区,它又是如何显示的呢?
只要是用的USysRibbons这个表存储的功能区,Access2007会自动加载并显示功能区。往往这不是我们所需要的,因为我们需要根据登录用户来显示不同的功能区,所以我们想手动控制。
那么,Access2007何时显示手动加载的功能区呢?我们知道,窗体显示功能区只要指定其功能区属性就可以显示与之相关的功能区。
同样,Access2007的全局功能区需要在Access的选项中的当前数据库选项卡中指定全局功能区的名称。
那么何时加载这个全局功能区呢?
事实上,Access有两种自动运行的机制:启动窗体和Autoexec自动宏,它们在数据库打开时都会自动运行。但两者的区别在于,Autoexec宏在Access初始化之前运行,启动窗体在Access初始化之后运行。全局功能区的显示则是在Access初始化的时候,在启动窗体运行之前。因此,我们必须在Autoexec自动宏中加载功能区,才能显示全局功能区。
所以我们设计一个自动宏Autoexec如下
宏 参数
RunCode LoadRibbons
这样,我们在数据库启动的时候就会首先运行自动宏来加载功能区,在数据库初始化之后,就能显示这个功能区了。