以下内容摘自《中文版Excel 2007 高级 VBA 编程宝典》
概述
Office 2007中最明显的变化可能是基于功能区的新用户界面了。本章提供了功能区的一个概述,并介绍了如何与VBA相关联。
从用户角度看新的Excel 2007 功能区用户界面 如何让VBA与功能区一起使用 用RibbonX代码定制Ribbon的入门介绍 修改功能区的工作簿示例 创建一个老式工具栏的样板化代码功能区是用户界面设计中的一个全新的概念。可以使用XML修改功能区,但是有一些功能区相关的操作可以用VBA执行。
对于Excel 2007,您注意到的第一件事可能是它的新外观。沿用多年的菜单/工具栏式的用户界面已被抛弃,取而代之的是选项卡/功能区式的新界面。虽然新界面与过时的菜单/工具栏式的界面有些类似,但是您会发现它们有本质的不同。
使用过Excel多年的用户可能会注意到,Excel的菜单系统随着新版本的出现越来越复杂。此外,工具栏的数量也激增。毕竟,每个新功能都必须是可访问的。过去,这些访问意味着要添加更多的项到菜单中,并创建新的工具栏。因此,Microsoft的设计人员着手解决这个过度拥挤的问题,这个新的功能区界面就是解决方案。
用户是否接受新的功能区界面,时间会告诉我们答案。正如笔者在本书中所述,对人们的反应的最好描述是“混合的”。当新事物出现时,总是有些人喜欢,有些人讨厌。
在笔者看来,许多有经验的Excel用户会感到轻微的困惑,因为所有他们熟悉的命令顺序都已不复存在。另一方面,新用户则可以快速掌握,因为他们不会被不相关的菜单和工具栏所牵制。
由于功能区UI是新增的,因此,在接下来的部分介绍了其他一些面向用户的信息。
功能区选项卡
功能区中有各种各样的可用命令,取决于选择哪一个选项卡。功能区将相关的命令按组划分。下面是Excel的选项卡概览:
开始:您可能会把大部分时间花在“开始”选项卡上。该选项卡包括基本的剪贴板命令、格式化命令、样式命令、插入和删除行列的命令,以及工作表编辑命令的分类。 插入:在工作表中插入某对象时,选择该选项卡。例如,插入表格、图示、图表、符号等。 页面布局:该选项卡包含影响工作表整体外观的命令,包括处理打印的设置。 公式:使用该选项卡来插入公式、命名范围、访问公式审核工具或者控制Excel执行计算的方式。 数据:Excel中与数据相关的命令包含在该选项卡上。 审阅:该选项卡包含检查拼写、翻译单词、添加批注和保护工作表的工具。 视图:视图选项卡包含控制如何查看工作表的命令。其中一些命令也可以从状态栏上获取。 开发工具:该选项卡默认是不可见的。它包含对开发人员有用的命令。要显示“开发工具”选项卡,选择“Office”-->“Excel选项”,然后选择“常用”。勾选“在功能区显示开发工具选项卡”复选框。 加载项:该选项仅在加载工作簿或定制菜单或工具栏的加载项时才可见(通过使用CommandBar对象)。由于菜单和工具栏在Excel 2007中不可再用,因此这些定制将显示在“加载项”选项卡中。
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/
可以用文本编辑器或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代码: