VBA开发Office 2007 Ribbon的方法
来源:互联网 发布:sentinel redis java 编辑:程序博客网 时间:2024/05/16 13:38
以下内容摘自《中文版Excel 2007 高级 VBA 编程宝典》
Chapter 22
使用功能区
概述
Office 2007中最明显的变化可能是基于功能区的新用户界面了。本章提供了功能区的一个概述,并介绍了如何与VBA相关联。
功能区是用户界面设计中的一个全新的概念。可以使用XML修改功能区,但是有一些功能区相关的操作可以用VBA执行。
22.1 功能区基础
对于Excel 2007,您注意到的第一件事可能是它的新外观。沿用多年的菜单/工具栏式的用户界面已被抛弃,取而代之的是选项卡/功能区式的新界面。虽然新界面与过时的菜单/工具栏式的界面有些类似,但是您会发现它们有本质的不同。
使用过Excel多年的用户可能会注意到,Excel的菜单系统随着新版本的出现越来越复杂。此外,工具栏的数量也激增。毕竟,每个新功能都必须是可访问的。过去,这些访问意味着要添加更多的项到菜单中,并创建新的工具栏。因此,Microsoft的设计人员着手解决这个过度拥挤的问题,这个新的功能区界面就是解决方案。
用户是否接受新的功能区界面,时间会告诉我们答案。正如笔者在本书中所述,对人们的反应的最好描述是“混合的”。当新事物出现时,总是有些人喜欢,有些人讨厌。
在笔者看来,许多有经验的Excel用户会感到轻微的困惑,因为所有他们熟悉的命令顺序都已不复存在。另一方面,新用户则可以快速掌握,因为他们不会被不相关的菜单和工具栏所牵制。
由于功能区UI是新增的,因此,在接下来的部分介绍了其他一些面向用户的信息。
功能区选项卡
功能区中有各种各样的可用命令,取决于选择哪一个选项卡。功能区将相关的命令按组划分。下面是Excel的选项卡概览:
Excel 2007 中的CommandBar 对象
Excel 97 中引用了一种处理工具栏和菜单的全新方式。这些用户界面元素是CommandBar对象。通常称为工具栏的实际上是三种命令栏之一:
基于兼容性的考虑,Excel 2007 仍支持CommandBar对象——但其功能已显著减少。终端用户不再可以创建自定义工具栏。然而,VBA编程人员仍然可以创建和使用CommandBar对象(参见第22.4节“创建老式工具栏”)。问题是,Excel 2007忽略了许多CommandBar对象的属性和方法。例如,每个工具栏或定制的菜单都出现在功能区的“加载项”选项卡中。控制工具栏大小和位置的属性不再有用。此外,不再有浮动的工具栏。
下面的图显示了Excel 2003 中定制的菜单和工具栏,以及Excel 2007中同样的菜单和工具栏。虽然这些用户界面元素在Excel2007中仍然是可用的,但是很显然已经不是开发人员脑海中曾经的印象了。
毫无疑问,许多VBA开发人员都想要为他们的应用程序重新做用户界面。
本章介绍了使用CommandBar对象来创建自定义工具栏的一个简单示例(参见22.4节)。如果想要了解关于使用CommandBar对象创建自定义菜单和工具栏的详细信息,可以参考本书以前的版本。
Excel 2007中仍然支持定制快捷菜单,第23章将会涉及该主题。
功能区中的命令的外观随Excel窗口宽度变化而变化。如果该窗口太窄,不能显示全部内容时,命令就会做调整,看上去像缺少的一样,但仍可用。图22-1显示了功能区的“开始”选项卡。在最上面的图中,所有控件都是可见的。在中间的图中,Excel的窗口窄了些。注意,有些描述性的文本不见了,而有些图标变小了。最下面的图显示了极端情况,窗口变得非常窄。有些组只显示一个图标。不过,如果单击该图标,则所有组命令都可用。
提示:
如果想隐藏功能区以增大工作表视图,双击任一选项卡。功能区消失(但选项卡仍存在),就可以看到工作表附加的5行。如果需再次使用功能区,可单击选项卡,它会暂时性地再次出现。为了永久恢复功能区,双击选项卡。也可按Ctrl+F1快捷键切换功能区的显示。
22.2 VBA和功能区
现在有一个大问题:VBA编程人员可以对功能区做些什么?答案很简单:并不多。
下面是可以使用VBA对功能区执行的操作列表:
确定特定控件是否被激活。
确定特定控件是否可见。
确定特定控件是否可以按下(对于切换按钮和复选框)。
获取控件的标签、屏幕提示或超级提示(对控件的更详细的描述)
显示与某个控件相关联的图像。
执行特定控件。
下面是想要对功能区进行却不可能实现的操作列表:
确定哪一个选项卡是当前选定的。
激活某个特定的选项卡。
添加新的选项卡。
添加一个新的组到选项卡。
添加新控件。
删除控件。
禁用控件。
22.2.1 访问功能区控件
Excel包含的功能区控件超过1700个。每个功能区控件都有一个名称,使用VBA操作控件时或以使用该名称。
使用,下列语句显示一个消息框,其中显示了ViewCustomViews控件的Enabled状态(该控件位于“视图”-->“工作簿视图”组)。
MsgBox Application.CommandBars.GetEnabledMso("ViewCustomView")
遗憾的是,不可能通过编写VBA代码来循环遍历功能区上的所有控件并显示控件名称列表。
22.2.2 使用功能区
在前面的章节中,介绍了一个使用CommandBars对象的GetEnabledMso方法的示例。下面是CommandBars对象中所有与使用功能区相关的方法的列表。所有这些方法都包含参数idMso,该参数表示的是命令的名称。
ExecuteMso:执行控件。
GetEnabledMso:如果指定控件被激活,则返回True.
GetImageMso:返回控件的图像
GetLabelMso:返回控件的标签
GetPressedMso:如果指定控件被按下,则返回True(应用于复选框和切换按钮控件)
GetScreentipMso:返回控件的屏幕提示(显示在控件中的文本)
GetSupertipMso:返回控件的超级提示(当鼠标指针移动到控件上时显现的对控件的描述)
其中一些方法是没有什么用的。为何VBA编程人员需要确定控件的屏幕提示呢?想不出原因。
下列VBA语句切换“选择和可见性”窗格(一个新功能,帮助选择工作表上的对象):
Application.CommandBars.ExecuteMso("SelectionPane")
下列语句显示了“选择性粘贴”对话框:
Application.CommandBars.ExecuteMso("PasteSpecialDialog")
下面的命令告诉我们公式编辑栏是否可见(对应于“视图”-->“显示/隐藏”组中的“编辑栏”控件的状态):
MsgBox Application.CommandBars.GetPressedMso("ViewFormulaBar")
注意:代码并不能通过访问功能区控件来改变公式编辑栏的可视性。然而,可以使用Application对象的DisplayFormulaBar属性:
Application.DisplayFormulaBar = True
下列语句在“合并后居中”控件被激活时显示True(该控件在工作表被保护或活动单元格位于表格内时被禁止执行)。
MsgBox Application.CommandBars.GetEnabledMso("MergeCenter")
下列VBA代码将ActiveX图像控件添加到活动工作表中,并使用GetImageMso方法来显示“开始”-->“编辑"组中的“查找和选择”控件的图像:
Sub ImageOnSheet()
Dim MyImage As OLEObject
Set MyImage = ActiveSheet.OLEObjects.Add _
(ClassType := "Forms.Image.1", _
Left := 50, _
Top := 50)
With MyImage.Object
.AutoSize = True
.BorderStyle = 0
.Picture = Application.CommandBars. _
GetImageMso("FindDialog", 32, 32)
End With
End Sub
22.2.3 激活选项卡
Microsoft并没有提供一种直接的方法来从VBA中激活功能区选项卡。但是,如果真的想这么做,使用SendKeys是唯一的选择。SendKeys方法模拟按键。激活“开始”选项卡所需的按键是Alt键,然后按H键。这些按键会显示功能区中的按键提示。如果要隐藏按键提示,只需按F6键。有了这些信息,下列语句就会发送所需按键来激活“开始”选项卡:
Application.SendKeys "%h{F6}"
插入:"%n{F6}"
页面布局:"%p{F6}"
公式:"%m{F6}"
数据:"%a{F6}"
审阅:"%r{F6}"
视图:"%w{F6}"
开发工具:"%l{F6}"
加载项:"%x{F6}"
关于快速访问工具栏:
在Excelr 的老版本中,终端用户要修改用户界面相对要简单一些。用户可以创建包含频繁使用的命令的自定义工具栏,甚至可以删除从不使用的菜单项。用户还可以显示任意数量的工具栏,随心所欲地移动工具栏。现在这些都不复存在了。
快速访问工具栏(QAT)是Excel 2007中唯一一个可以由用户自定义的用户界面元素。用户添加一个命令到QAT中十分简单,因此不论激活哪一个功能区选项卡,命令都是可用的。QAT不能移动,但是Microsoft允许用户决定是否显示QAT:显示在功能区的上面或下面。
QAT并不是对象模型的一部分,因此不能使用VBA对QAT进行操作。
QAT信息被存储在名为Excel.qat的XML文件中。文件路径如下:
c:/Documents and Settings/<username>/Local Settings/Application Data/Microsoft/Office
可以用文本编辑器或XML浏览器来浏览该文件。如果复制了该文件,并用XML扩展名重命名,那么甚至可以用Excel打开(提示如何打开文件、指定为XML表格时)。但是,不能使用Excel修改Excel.qat文件。
22。3 定制功能区
使用VBA不能执行任何功能区修改。因此,需要编写RibbonX代码,将其插入到工作簿文件中——这些都在Excel外部完成。可以创建VBA回调过程。回调过程是一个VBA宏,该宏在自定义的功能区控件被激活时执行。
RibbonX代码是一个XML标记,它描述了控件、控件在功能区中显示的位置、控件的外观以及控件激活时发生的事件。本书并没有详细介绍RibbonX——它太过复杂,甚至可以用整本书进行描述。但是,本书介绍了一些样本示例,以便您可以更好地理解修改Excel 2007用户界面所涉及的知识,以及确定这些是否是您想要学习的东西。
22。3。1 RibbonX的一个简单示例
本小节详细描述了各个步骤细节,以便您对修改Excel的功能区有一个整体感觉。该示例在“数据”选项卡上创建了一个新的功能区组(名为Custom)。它还在新的功能区组中创建了两个按钮,分别标记为Hello World 和 Goodbye World。单击任何一个按钮都会执行一个VBA宏。
查看错误
在开始使用功能区定制之前,必须激活RibbonX错误的显示。访问“Office“-->“Excel选项卡“对话框,单击“高级”选项卡。向下浍到“常规”部分,选中“显示加载项用户接口错误”复选框。
激活该设置后,打开工作簿时就会显示RibbonX错误(如果有的话)——这有助于调试。
下面是创建一个包含修改功能区的RibbonX代码的工作簿的步骤:
(1)创建一个新的Excel工作簿,插入一个VBA模块,输入两个回调过程。这些过程在单击按钮时被执行:
Sub HelloWorld(Control As IRibbonControl)
MsgBox "Hello World!"
End Sub
Sub GoodbyeWorld(Control As IRibbonControl)
ThisWorkbook.Close
End Sub
(2)保存工作簿,将欺命名为ribbon modification.xlsm。
(3)关闭工作簿。
(4)激活包含ribbon modification.xlsm文件的文件夹,创建一个名为customUI的文件夹。
(5)在该文件夹内,使用文本编辑器(如Windows记事本)来创建一个名为customUI.xml的文本文件,里面包含下列Ribbon XML代码:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="Group1" label="Custom">
<group id="Group1" label="Custom">
<button id="Button1"
label="Hello World"
size="normal"
onAction="HelloWorld"
imageMso="HappyFace" />
<button id="Button2"
label="Goodbye World"
size="normal"
onAction="GoodbyeWorld"
imageMso="DeclineInvitation" /?
</group>
</tab>
</tabs>
</ribbon>
</customUI>
(6)使用Window资源管理器,给ribbon modification.xlsm文件添加一个.zip扩展名。文件名就变为ribbon modification.xlsm.zip。
(7)将第4步中创建的customUI文件夹拖动到ribbon modification.xlsm.zip文件中。
(8)双击ribbon modification.xlsm.zip文件将其打开。该文件夹包含一些文件夹。
(9)双击ZIP文件中的_rels文件夹。该文件夹包含一个文件,名为.rels。
(10)将.rels文件拖动到ZIP文件的外面(如拖动到桌面)。
(11)用文本编辑器打开.rels文件(是一个XML文件),如记事本。
(12)将下列代码添加到.rels文件中,放在</Relationships>标记之前:
<Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="12345" />
(13)保存.rels文件,将其拖回到ZIP文件中,覆盖掉原始版本。
(14)删除.zip扩展名,文件就变回原来的名称:ribbon modification.xlsm。
打开Excel中的工作簿,如果一切都正常,就会看到数据栏中有一个新组,该组包含两个按钮。
功能区的修改是基于具体文档的,理解这一点非常重要。换言之,只有当包含RibbonX代码的工作簿是一个活动工作簿时,新的功能区组才会被显示。这与Excel老版本中的用户界面修改相背离。
提示:
要在工作簿活动时显示功能区定制,只需将工作簿换为一个加载宏文件,或将RibbonX代码添加到Personal Macro Workbook中。
如果认为花费这么多努力来修改Excel的功能区并不值得,请不要失望。可以使用一些工具让整个过程不那么冗长而乏味。在编写本书的时候,只有一个这样的可用工具:Office 2007 Custom UI Editor,由Trang Luu编写。该过程仍然要求手动创建RibbonX代码,但是过程会验证代码的有效性。它还略去了所有繁琐的手动文件操作。最后,会生成VBA回调过程声明,该声明可以复制并粘贴到VBA模块中。
22。3。2 更多关于RibbonX的简单示例的内容
本小节介绍了一些关于前面部分所讨论的ribbon modification.xlsm工作簿的更多细节。
1。VBA回调过程
还记得工作簿包含了两个VBA过程,即HelloWorld和GoodbyeWorld。这些过程名称对应于RibbonX代码中的onAction参数。onAction参数是将RibbonX代码链接到VBA代码的唯一的方法。
这两个VBA过程都包含一个名为control的参数,该参数是一个IRibbonControl对象。该对象具有3个属性,可以从VBA代码中访问:
context:活动窗口的句柄,该窗口包含了触发回调的功能区。例如,可以使用下列表达式来获取包含RibbonX代码的工作簿名称:
control.Context.Caption
Id:包含了控件的名称,指定为Id参数。
Tag:包含与控件相关联的所有文本。
VBA回庙过程的复杂度可以按需设定。
2. .rels文件
插入包含RibbonX代码的文件并没有任何影响,除非在文档文件和定制文件之间指定一种关系。这些关系用XML编写,存储在_rels文件夹中的.rels文件中。下面是上一小节中介绍的救命的关系:
<Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="12345" />
Target参数指向包含RibbonX代码的customUI.xml文件。Id参数包含了一个随机文本字符串。该字符串可以包含任何东西,只要它对于文件来说是唯一的(即,只要没有其他的<Relationship>标记使用同样的Id)。
3. RibbonX代码
下面是技巧部分。编写XML代码来定义用户界面修改并不是一项简单的任务。之前已经提过,这本书并不是教您如何编写RibbonX代码。这儿将会介绍一些简单的示例,您可以参考其他一些资料以进一步了解。
在刚开始着手时,最好从有效的示例开始(搜索Web),然后做一些小的修改,在些过程中经常性地进行测试。可能会有这样的事情发生,您花费了一个小时来研究代码,这些代码从各方面看都很完美,但随后才意识到XML是区分大小写的,ID与id并不相等,这种事往往很令人沮丧。
22。3。3 RibbonX的另一个示例
本小节介绍了使用RibbonX来修改用户界面的另外一个示例。该工作簿在“页面布局”选项卡上创建了一个新组,并添加了一个切换分页符显示的复选框控件。
注意:
虽然Excel中包含的命令超过1700个,但是却没有一个可以切换分页符显示的命令。在打印或预览一个工作表之后,隐藏分页符显示的唯一方法是使用“Excel选项“对话框。因此,该示例还具有一些实际价值。
该示例有一些困难,因为它要求新的功能区控件与活动工作表同步。例如:如果激活一个不显示分页符的工作表,复选框控件就应当是被选中的。此外,分页符与图表工作表并不相关,因此,如果激活一个图表工作表,那么该复选框控件应是禁用的。
1. RibbonX代码
向“页面布局“选项卡中添加一个新组的RibbonX代码(使用CheckBox控件)如下:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Initialize">
<ribbon>
<tabs>
<tab idMso="TabPageLayoutExcel">
<group id="Group1" label="Custom">
<checkBox id="CheckBox1"
label="Page Breaks"
onAction="TogglePageBreakDisplay"
getPressed="GetPressed"
getEnabled="GetEnabled" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
该RibbonUI代码引用了4个VBA回调函数(每个函数都将在稍后进行介绍):
Initialize:打开工作簿时执行
TogglePageBreakDisplay:用户单击复选框控件时执行。
GetPressed:控件失效(用户激活另一个工作表)时执行。
GetEnabled:控件失效(用户激活另一个工作表)时执行。
2.VBA代码
CustomUI标记包含一个onLoad参数,该参数指定了Initialize VBA回调函数,如下所示:
Public MyRibbon As IRibbonUI
Sub Initialize(Ribbon As IRibbonUI)
'Exccuted when the workbook loads
Set MyRibbon = Ribbon
End Sub
Initialize过程创建了一个名为MyRibbon的IRibbonUI对象。注意,MyRibbon是一个公有变量,因此可以从模块的其他过程中获取。
创建了一个简单的事件程序,该过程在工作表被激活时执行。它位于ThisWorkbook代码模块中,调用CheckPageBreakDisplay过程:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call CheckPageBreakDisplay
End Sub
CheckPageBreakDisplay过程使复选框控件失效。换言之,它销毁了与该控件相关的所有数据。
Sub CheckPageBreakDisplay()
'Executed when a sheet is activated
MyRibbon.InvalidateControl("Checkbox1"
End Sub
当控件失效时,GetPressed和GetEnabled过程被调用。
Sub GetPressed(control As IRibbonControl, ByRef returnedVal)
'Executed when the control is invalidated
On Error Resume Naxt
returnedVal = ActiveSheet.DisplayPageBreaks
End Sub
Sub GetEnabled(control As IRibbonControl, ByRef returnedVal)
'Executed when the control is invalidated
return = TypeName(ActiveSheet) = "Worksheet"
End Sub
注意,returnVal参数是ByRef传递。这意味着代码可以改变该参数的值。这也确实发生了。在GetPressed过程中,returnVal变量被设置为活动工作表的DisplayPageBreaks属性的状态。产生的结果是,如果分页符被显示,则控件的Pressed参数为True(控件被选中)。否则,控件未被选中。
在GetEnabled过程中,如果活动工作表是一个工作表(与图表工作表相对),则returnVal变量被设置为True。因此,只有在活动表为一个工作表时,该控件才被激活。
另一个VBA过程是onAction过程,即TogglePageBreakDisplay,用户选中或未选中复选框时执行该过程。
Sub TogglePageBreakDisplay(control As IRibbonControl, pressed As Boolean)
'Executed when check box is clicked
On Error Resume Next
ActiveSheet.DisplayPageBreaks = pressed
End Sub
如果用户选中复选框,则传递的参数为True:如果未选中复选框,则传递的参数为False。代码据此设置DisplayPageBreaks属性。
22。3。4 功能区控件演示
本小节简要介绍了RibbonX代码和VBA回调过程。
1.创建一个新选项卡。
创建新选项卡的RibbonX代码如下:
<ribbon>
<tabs>
<tab id="CustomTab" label="My Stuff" />
</tabs>
</ribbon>
提示:如果想要创建一个最小的UI,可以使用ribbon标记的startFromScratch属性。如果将其设置为True,那么所有的内置选项卡都会被隐藏。此外,除了“新建”、“打开”、“Excel选项“和”退出“命令之外,所有的Office按钮菜单命令都会被隐藏。
<ribbon startFromScratch="true">
2.创建一个功能区
ribbon controls demo.xlsm 示例中的代码在My Stuff选项卡上创建了4个组。下面是创建这4个组的代码:
<group id="Group1" label="Stuff">
</group>
<group id="Group2" label="More Stuff"?
</group>
<group id="Group3" label="Built In Stuff">
</group>
<group id="Group4" label="Galleries">
</group>
- VBA开发Office 2007 Ribbon的方法
- 基于Office的开发-VBA
- office VBA开发视频教程
- Office 2007 风格控件(Ribbon)
- VBA-office的自动化
- MS Office 开发工具--VBA
- .net开发office插件,ribbon刷新
- Winform开发框架之Office Ribbon界面
- VBA 开发前 excel环境设置office 2007
- 如何隐藏Office的Ribbon界面
- WTL-Ribbon 类似office 工具条的使用方法
- Office VBA的设计模式
- RibbonX: Customizing the Office 2007 Ribbon
- Office 2010 中的 VBA 开发入门
- 替换RCP的Coolbar,让RCP支持Office 2007的样式---SWT Ribbon
- VBA调用Outlook2010 Ribbon上按钮的命令
- MFC的Ribbon开发设计
- 利用VBA自定义Office的快捷方式
- 雕刻家
- 防止网页被图片撑开
- 绩效面谈,让员工内心不再抗拒
- Boost编译方法
- MySQL学习之路(七):MySQL中子系统之间的联系
- VBA开发Office 2007 Ribbon的方法
- jstl 应用
- 关于端口以及如何查看端口
- UML学习笔记
- 天天觉得迷茫,常常没事忧伤。你迷茫个鬼,忧伤个死啊!
- 安卓手机现在处于非常复杂时期 建议不要购买 ,更多信息请阅读 官网 Satsun 工作室
- 使用异步 I/O 大大提高应用程序的性能
- c#:silverlight &javascript交互
- 秋天,日子仍在继续……