VBA开发Office 2007 Ribbon的方法

来源:互联网 发布:sentinel redis java 编辑:程序博客网 时间:2024/05/16 13:38

以下内容摘自《中文版Excel 2007 高级 VBA 编程宝典》

 

Chapter 22

使用功能区

概述

    Office 2007中最明显的变化可能是基于功能区的新用户界面了。本章提供了功能区的一个概述,并介绍了如何与VBA相关联。

  • 从用户角度看新的Excel 2007 功能区用户界面
  • 如何让VBA与功能区一起使用
  • 用RibbonX代码定制Ribbon的入门介绍
  • 修改功能区的工作簿示例
  • 创建一个老式工具栏的样板化代码
  •     功能区是用户界面设计中的一个全新的概念。可以使用XML修改功能区,但是有一些功能区相关的操作可以用VBA执行。

    22.1 功能区基础

        对于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/<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>

     

     

     

     

     

     

    原创粉丝点击