本类文章的标签为 ‘QAT’


细品RibbonX(48):在Visual Studio中自定义Office 2007用户界面的快速访问工具栏(QAT)

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

在Microsoft Office 2007中自定义快速访问工具栏,仅需要几行XML和编程代码。
概述
2007 Microsoft Office Fluent用户界面(UI)使用更简单的设计代替了当前系统的层级菜单、工具栏和任务窗格,使得操作更有效率。Office Fluent Ribbon、快捷菜单、快速访问工具栏和Offce菜单是Office Fluent UI的所有组成部分。可以在Office Fluent Ribbon中添加很多的自定义控件和内置控件,例如按钮、复选框和组合框。
通过使用XML标记元素,在Office Fluent Ribbon中添加组件,并且通过属性来设置这些组件的属性,通过使用任何Microsoft Visual Studio支持的编程语言,例如Visual Basic和Visual C#、以及VBA、Visual C++、Visual Basic 6.0来赋予这些组件功能。
使用XML添加控件
XML提供了Office Fluent用户界面层级的、公开的模型。通过使用XML元素指定组件的类型,可以在功能区中添加控件(例如按钮),例如可以使用button元素添加一个按钮,通过使用属性例如label属性给控件赋属性值。
下面是用于自定义Office Fluent UI的XML的示例,在Excel 2007中通过添加提供内置复制功能的按钮和内置粘贴功能的按钮来自定义QAT。

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="true">
    <qat>
      <sharedControls>
        <button idMso="Copy"/>
        <button idMso="Paste"/>
      </sharedControls>
    </qat>
  </ribbon>
</customUI>

该示例首先设置ribbon元素的startFromScratch属性为true,设置该属性使Office Fluent Ribbon在“start from scratch”模式下,隐藏了所有内置选项卡。接着,通过在代码中添加qat元素,创建对QAT的引用。然后,添加sharedControls元素封装QAT中任何自定义控件。最后,添加两个按钮,一个是内置的复制功能,一个是内置的粘贴功能。
结果如下图所示。
CustomQATSample1
注:通过使用idMso属性,可以告诉控件引用内置于Microsoft Office里的功能,包括Mso后缀的属性名称总是指向包含在Microsoft Office里的功能和资源。相反,使用id属性代表自定义控件。
有两种方式来自定义Office Fluent UI:

  • 修改支持Office Fluent UI的Office应用程序所创建的Office Open XML格式文件。
  • 使用加载项。

可以根据定制用户界面的需要来选择技术。例如,修改基于Office Open XML格式文件是文档级定制,所定制的Office Fluent Ribbon仅与特定的文档相关,而不是整个应用程序;通过使用加载项,将获取应用程序级的定制,这意味着定制的Ribbon将应用到整个应用程序中,而不管打开哪个文档。
使用Office Open XML格式文件创建定制的Ribbon
1、通过改变文件的扩展名,使之成为一个压缩文件(.zip),然后打开该文件。
2、添加一个包含XML定制代码的文件夹。
3、修改该文档相联系的文件来指向自定义文件夹。
4、改变该文档的扩展名。
5、在Office应用程序里打开该文档。
6、添加代码到文档中,提供自定义用户界面的功能。
使用加载项
使用加载项定制用户界面也简单。在创建加载项工程后,实现IRibbonExtensibility接口,包括Microsoft.Office.Core命名空间。该接口包含一个名为GetCustomUI方法,使用该方法返回XML定制代码。然后添加编程过程,提供自定义用户界面的功能。
自定义QAT
创建在功能区中添加自定义按钮的加载项解决方案。
1、开启Visual Studio 2008。
2、在“文件”菜单中,单击“新建项目”。
3、在“新建项目”对话框中,在“项目类型”窗格中,展开“Office”节点,并选择“2007”,然后选择“Excel 2007外接程序”。
4、在名称框中,输入CustomQATSample,然后单击“确定”创建项目。
5、在“解决方案资源管理器”中的项目名上单击右键,选择“添加—新建项”。在“添加新项”对话框中选择“功能区(XML)”,使用默认的名称,单击“确定”。
6、在“解决方案资源管理器”中的项目名上单击右键,选择“属性”,打开项目属性窗口,并选择“资源”选项卡。将“解决方案资源管理器”中的Ribbon1.xml拖到资源窗口中。
7、编辑Ribbon1.xml的默认代码为自定义代码:

  <ribbon startFromScratch="true">
    <qat>
      <sharedControls>
        <button idMso="Copy"/>
        <button idMso="Paste"/>
      </sharedControls>
    </qat>
  </ribbon>

8、将Ribbon1.vb中顶部声明行中的代码复制到ThisAddIn.vb中,并取消注释。
9、保存并按F5启动调试,结果如上图所示。

相关文章

细品RibbonX(47):更改Excel 2007快速访问工具栏中按钮的图标

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 4.00 out of 5)
Loading ... Loading ...

下面介绍修改QAT中宏按钮或内置按钮图标的方法。
如下图所示,在QAT中添加一个宏。
ChangeAQTImageSample1
Excel将QAT的设置保存在名为Excel.qat的文件中,该文件位于:

C:\Documents and Settings\\Local Settings\Application Data\Microsoft\Office\Excel.qat

注意,如果没有自定义QAT,那么该文件不存在。
现在,要修改该宏的图标,虽然可以在自定义选项中进行修改,但只是修改宏按钮的图像,并且只能修改为内置的图标。使用下面的方法可以修改内置按钮或宏按钮的图标。
在记事本或任何XML编辑器中打开Excel.qat文件,将看到下列内容:

<mso:customUI xmlns:x1="http://schemas.microsoft.com/office/2006/01/customui/macro" 
xmlns:mso="http://schemas.microsoft.com/office/2006/01/customui">
<mso:ribbon>
<mso:qat>
<mso:sharedControls>
 
<mso:control idQ="mso:FileNewDefault" visible="false"/>
<mso:control idQ="mso:FileOpen" visible="false"/>
<mso:control idQ="mso:FileSave" visible="true"/>
<mso:control idQ="mso:FileSendAsAttachment" visible="false"/>
<mso:control idQ="mso:FilePrintQuick" visible="false"/>
<mso:control idQ="mso:FilePrintPreview" visible="false"/>
<mso:control idQ="mso:Spelling" visible="false"/>
<mso:control idQ="mso:Undo" visible="true"/>
<mso:control idQ="mso:Redo" visible="true"/>
<mso:control idQ="mso:SortAscendingExcel" visible="false"/>
<mso:control idQ="mso:SortDescendingExcel" visible="false"/>
<mso:button idQ="x1:C:_Documents_and_Settings_Administrator_桌面_ChangeAQTImageSample.xlsm_MyMacro_1" visible="true" label="MyMacro" onAction="C:\Documents and Settings\Administrator\桌面\ChangeAQTImageSample.xlsm!MyMacro" imageMso="ListMacros"/>
 
</mso:sharedControls>
</mso:qat>
</mso:ribbon>
</mso:customUI>

其中,中间部分的前11行是QAT中默认的按钮,可以通过下拉QAT右侧的箭头看到,而最后一行(即下面所示的)是我们添加的按钮。

<mso:button idQ="x1:C:_Documents_and_Settings_Administrator_桌面_ChangeAQTImageSample.xlsm_MyMacro_1" visible="true" label="MyMacro" onAction="C:\Documents and Settings\Administrator\桌面\ChangeAQTImageSample.xlsm!MyMacro" imageMso="ListMacros"/>

将imageMso=”ListMacros”修改为imageMso=”M”,即可以修改该按钮的图像。

<mso:button idQ="x1:C:_Documents_and_Settings_Administrator_桌面_ChangeAQTImageSample.xlsm_MyMacro_1" visible="true" label="MyMacro" onAction="C:\Documents and Settings\Administrator\桌面\ChangeAQTImageSample.xlsm!MyMacro" imageMso="M"/>

修改后如下图所示。
ChangeAQTImageSample2
若要修改内置按钮的图像,同样修改为imageMso=”M”或者其他图像。
当然,你也可以将文件名更改为压缩文件后缀,然后解压缩,修改相应的qat代码来修改按钮的图像。

相关文章

细品RibbonX(46):在Excel 2007的QAT中以表驱动的方式构建自定义菜单

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

一、创建在所有工作簿中都能使用的自定义菜单
如果想在所有工作簿中都可以使用自已喜欢的宏,那么可以将这些宏复制到Personal.xlsb工作簿中,或者在XLStart文件夹中使用另一个隐藏的xlsb工作簿(在Excel启动时会打开该文件夹中的每一个文件),也可以创建加载项。
XLSTART文件夹的位置

C:\Documents and Settings\(username)\Application Data\Microsoft\Excel\XLSTART

如果找不到指定的文件或文件夹,则可能是Windows设置将其隐藏了,此时需要在文件夹选项中启动“显示所有文件和文件夹”选项。
如何在Excel2007中创建菜单
在Excel 97-2003中,在已存在的菜单栏中创建一个新菜单或者创建自定义菜单栏一点也不困难。但是在Excel 2007中,定制功能区并不容易。
1) 在下面的地址中下载文件MyMacroFile.zip:

http://www.rondebruin.nl/files/My%20Add-in.zip

2) 解压并复制该文件到XLSTART文件夹中,然后打开Excel(不能看到该文件,因为它是隐藏的)。
3) 在快速访问工具栏(QAT)中单击鼠标右键,选择“自定义快速访问工具栏”。
在“从下列位置选择命令”下拉框中选择“宏”,然后在“自定义快速访问工具栏”下拉框中选择“用于所有文档(默认)”。
选择“DisplayPopUp”宏,按下“添加” ,然后单击“确定”按扭,如图1所示。
customqatsample1
图1
在图1中,可以使用“修改”按钮命令来改变图标。
注 : 仅需执行操作一次,因为该按钮被保存在Excel QAT定制文件中。
如果不想再使用该菜单,则从XLSTART文件夹中移除该xlsb文件后,还需手工从QAT中删除该菜单按钮。
4) 如果在QAT中单击该图标,则将弹出自定义的菜单,如图2所示。
customqatsample2
图2
编辑该菜单:
在功能区“视图”选项卡中单击“取消隐藏”命令,在弹出的对话框中选择MyMacroFile.xlsb 文件并单击“确定”按钮。
此时,将显示如图3所示隐藏的工作表“MenuSheet”:
customqatsample3
图3
Level: 指定菜单项的层级,有效值为2和3。2级代表菜单项,3级代表子菜单项。
Caption: 显现在菜单、菜单项或子菜单里的文本,使用符号(&)来指定加下划线(热键)的字符。
Macro name: 对于2级或3级项目,在选择该项时要执行的宏。如果2级项目有一个或多个3级项,则2级项目可能没有与之相关联的宏。使用Alt+F11键打开VBE编辑器,可以在MacroModule模块中添加或修改宏程序。
Divider: 值为True时,则在菜单项或子菜单项前放置一个分隔条。
FaceID: 可选的。代表显示在项目旁边的内置图形图像的代号数字。
您可以编辑该表中的信息,从而创建自已的菜单。单击“Refresh Menu”按钮来查看是否作出了正确的修改。如果正确,则单击“Hide Save”按钮。
二、创建只在一个工作簿中可用的自定义菜单
本节的内容与上节内容大致相同,主要的区别在于工作簿文件为xlsm工作簿,直接打开该工作簿,并不需要将其放置在特定的文件夹中。
在下面的地址中下载MyWorkbook.xlsm工作簿文件。

http://www.rondebruin.nl/files/MyWorkbook.zip

下载该工作簿后,直接在Excel中打开该工作簿,然后按照上节3)以后的内容进行操作即可。
三、在加载项中存储自定义菜单
可以将带有自定义菜单的工作簿保存为Excel加载项(xlam),然后再在工作簿中启用该加载项。这样,QAT中的按钮将保存在加载项中,并且可以在所有打开的工作簿中使用。
对于上面介绍的示例工作簿,只需将下面的过程中的两行代码删除或注释掉,然后将其保存为Excel加载项。

Sub WBDisplayPopUp()
' If ActiveWorkbook.Name = ThisWorkbook.Name Then
    On Error Resume Next
    Application.CommandBars(ThisWorkbook.Sheets("MenuSheet").Range("B2").Value).ShowPopup
    On Error GoTo 0
' End If
End Sub

创建带有菜单的加载项,而这些菜单中是您想要分发的宏程序。这是一种很好的方式。

注:本文参考了Ron de Bruin的一系列文章,有兴趣的朋友可以直接参考其网站的文章。
同时,参见:表驱动的方式构建自定义菜单

相关文章

细品RibbonX(45):在快速访问工具栏(QAT)中添加项目

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

快速访问工具栏(QAT)是Office 2007新用户界面的一部分,可以使用老的Office工具栏定制方法进行定制。下面,我们主要介绍如何使用XML定制QAT。
概述
QAT可以包含共享控件和特定文档控件,也可以包含整个控件组(内置的和自定义的)以方便地在单一位置存储多个控件。
要定制QAT,必须从头开始设计用户界面,这意味着必须将startFromScratch属性设置为true:

   <ribbon startFromScratch="true">

在处理QAT时,你会注意到有两类图标,一种在其周围有边框而另一种则没有,这种区别表明哪种控件是共享控件,哪种控件是文档控件。
QAT文档控件的XML代码如下:

   <qat>
     <documentControls>
        <control/>
     </documentControls>
   </qat>

QAT共享控件的XML代码如下:

    <qat>
        <sharedControls>
            <control/>
        </sharedControls>
    </qat>

在QAT中添加自定义和内置命令
快速访问工具栏共享或文档控件的子元素如下表。
表:QAT的子元素

对象 用来做什么
control 引用可以表现其它对象例如按钮、拆分按钮、组等的普通控件对象
button 引用按钮控件
separator 引用分隔条控件


如下图所示,在QAT中添加内置控件和自定义按钮。
QAT1
XML代码如下:

   <qat>
     <documentControls>
	<control 
       idMso="Bold"
       screentip="Make it Bold"
       supertip="Click here to make the selected text bold."/>
      <button
       id="rxbtnOpen"
       imageMso="FileOpen"
       screentip="This is Happy"
       supertip="Click here for a happy message"
       onAction="rxbtnOpen_click"/>
     </documentControls>
    </qat>

可以使用control对象引用内置的按钮(本例中为加粗按钮),接着使用按钮创建自已的定制按钮(可以使用control对象引用其它控件例如按钮或拆分按钮)。
下面的示例创建一个splitButton控件,然后将其添加到QAT。因为QAT没有splitButton子元素,我们必须在QAT之外创建splitButton,然后将其引用到QAT。可以通过以普通的方式添加splitButton来实现——也就是说,通过将其添加到组中开始:

       <group 
        id="rxgrp" 
        label="My Custom Group">
        <splitButton 
         id="rxsbtn" 
         size="large">
         <button 
          id="rxbtn2" 
          imageMso="HappyFace" 
          label="My Happy Split"/>
          <menu 
           id="rxmnu">
           <button 
            id="rxbtn3" 
            label="My Happy Menu"
            imageMso="HappyFace"
            onAction="rxbtn3_click"/>
          </menu>
        </splitButton>
        </group>

上面已经有splitButton并带有一个菜单,菜单中包含一个按钮。由于QAT使用现有的控件,因此现在可以在QAT中引用已存在的拆分按钮了,XML代码如下:

   <qat>
     <documentControls>
      <control
       id="rxsbtn"
       imageMso="HappyFace"
       screentip="This is Happy"
       supertip="Click here for a happy message"/>
     </documentControls>
    </qat>

结果如下图所示。
QAT2
在QAT中添加自定义和内置组
必须首先创建组,然后从QAT中引用指定该组的id。可以添加组到选项卡中并使其在选项卡中不可见而在QAT中可见。
QAT3
如上图所示,My QAT Custom Group属于自定义的“Home”选项卡,然而我们将其可见属性设置为False,使其在选项卡上隐藏而在QAT中可见。XML代码如下:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
   <ribbon startFromScratch="true">
     <tabs>
      <tab
       id="rxtabHome"
       label="Home">
       <group
        idMso="GroupClipboard"/>
       <group
        idMso="GroupFont"/>
       <group
        idMso="GroupAlignmentExcel"/>
       <group
        idMso="GroupNumber"/>
       <group
        idMso="GroupStyles"/>
       <group
        idMso="GroupCells"/>
       <group
        idMso="GroupEditingExcel"/>
	 <group
	  id="rxgrp" 
	  label="My QAT Custom Group"
        getVisible="rxshared_getVisible">
 
	  <button 
	   id="rxbtnHappy" 
	   label="Mr. Happy Face" 
	   imageMso="HappyFace" 
	   size="large" 
	   onAction="rxshared_click" />
	  <button 
	   id="rxbtnHappy2" 
	   label="Mr. Happy Face 2" 
	   imageMso="HappyFace" 
	   size="large"
	   onAction="rxshared_click" />
	 </group>
 
      </tab>
     </tabs>
 
    <qat>
     <documentControls>
	<control
	  idMso="GroupInsertChartsExcel"/>
      <control
        idMso="GroupFunctionLibrary"/>
      <control
        id="rxgrp"
        imageMso="FormatCellsDialog"/>
     </documentControls>
    </qat>
 
  </ribbon>
</customUI>

这里,因为要处理QAT,所以我们从头开始定制用户界面,然后以常规方式设置自定义选项卡和组并在自定义组中添加了两个按钮,将自定义组的getVisible属性设置为False,使其不会在选项卡中显示。最后,在QAT标签中,添加了两个自定义组,然后使用通用的control对象来引用想在QAT中显示的自定义组,同时为组赋予了内置的图像。
注意,有时虽然我们在QAT中定制了组,但打开Excel时不会出现,这是QAT中的一个“小问题”,后文将给出解决方法。
重利用QAT控件
当重利用QAT中的控件时,实际上重利用与之相关的命令,然后作为控件在QAT中添加相同的命令。
重利用的一个主要优势是会对该控件产生全局影响。
下面的XML代码重利用Excel中的两个控件——打开和保存:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
    onLoad="rxIRibbonUI_onLoad">
    <commands>
     <command
      idMso="FileSave"
      onAction="rxFileSave_repurpose"/>
     <command
      idMso="FileOpen"
      onAction="rxFileOpen_repurpose"/>
    </commands>
 
   <ribbon startFromScratch="true">
     <qat>
     <documentControls>
	<control 
       idMso="FileSave"
       screentip="Repurposed Save"
       supertip="This is a repurposed command"/>
 
      <control
       idMso="FileOpen"
       screentip="Repurposed File Open"
       supertip="This is a repurposed command"/>
     </documentControls>
    </qat>
  </ribbon>
 
</customUI>

首先,声明希望重利用的命令并赋宏给每个控件,接着在ribbon标记里定义希望在QAT中出现的命令。
注意,这将产生全局影响,也就是说,如果在该命令出现的任一位置单击该命令或者使用指向该命令的快捷键(这里是Ctrl+o和Ctrl+s),该命令将指向赋值给onAction属性的回调。
在Excel中还可以使用不同的方式。Excel有一个名为OnKey的便捷的方法,当按下指定的键或键组合时触发。这是一个应用程序级的方法,因此一旦在某工作簿中禁用了某命令,所有在相同会话中打开的其它工作簿都将禁用该命令。
因此,在Excel中,如果仅仅需要取消包含UI的工作簿中的快捷键,那么在移动到另一个工作簿中时或者当打开工作簿时需要撤销该快捷键的取消。因为这是一个应用程序级的事件,所以需要使用类模块来监控并响应在工作簿间的转换。
在Excel项目中添加一个类模块并命名,本例中命名为clsAppExcelEvents,输入下面的代码:

Public WithEvents appXL As Excel.Application
 
Private Sub ShortcutsEnabled(ByVal blnEnabled As Boolean)
    Select Case blnEnabled
        Case Is = True
            Application.OnKey "^o"
            Application.OnKey "^s"
        Case Is = False
            Application.OnKey "^o", "commandDisabled"
            Application.OnKey "^s", "commandDisabled"
    End Select
End Sub
 
Private Sub setEnabled(ByVal Wb As Workbook)
    Select Case Wb.Name
        Case Is = ThisWorkbook.Name
            ShortcutsEnabled False
        Case Else
            ShortcutsEnabled True
    End Select
End Sub

注意,在类模块的声明部分声明Excel应用程序。有两个程序来实现这项任务:一个程序检查哪个工作簿是活动工作簿,另一个程序指定OnKey方法。OnKey方法的键组合字符之后,是程序名commandDisabled,该程序必须放置在标准模块中。
在类模块中,可以指定监控的事件。例如,可以监控某工作簿的激活或失活,决定是否取消快捷键:

Private Sub appXL_WorkbookActivate(ByVal Wb As Workbook)
    setEnabled Wb
End Sub
 
Private Sub appXL_WorkbookDeactivate(ByVal Wb As Workbook)
    setEnabled Wb
End Sub

最后,需要在工程打开时设置类,这由包含该工程的工作簿的Open事件来实现:

Dim XL As New clsAppExcelEvents
Private Sub Workbook_Open()
    Set XL.appXL = Application
End Sub

使用表驱动(Table-Driven)方式定制QAT
下图是一个自定义QAT的示例,使用表装载详细信息到QAT中。
QAT4
首先,编写包含UI和QAT菜单按钮的XML代码,这里创建的是文档控件按钮:

     <documentControls>
	<control
	  id="rxgrp"
        imageMso="AdvancedFileProperties"/>
      <button 
	  id="rxbtnShowPopup"
        image="rob"
	  screentip="This is Robert's QAT"
	  supertip="You can only customize the QAT by starting from scratch. If you do not do that you will not be able to make any changes..."
	  onAction="rxbtnShowPopup_Click"
	  />
     </documentControls>

上述XML代码将产生上图所示的两个QAT按钮,这里的关键是赋给onAction属性的回调,单击该按钮后将显示菜单。
接着,创建包含菜单信息的表,如下图所示。
QAT5
上图所示的表只是一个建议,因为您可以在其中添加更多的选项。现在,使用VBA阅读该表并创建菜单:

Public Const POPNAME As String = "MY POPUP"
 
Sub loadPopup()
    Dim mnuWs           As Worksheet
    Dim cmdbar          As CommandBar
    Dim cmdbarPopup     As CommandBarPopup
    Dim cmdbarBtn       As CommandBarButton
    Dim nRowCount       As Long
 
    Call unloadPopup
    Set mnuWs = ThisWorkbook.Sheets("MenuItems")
    Set cmdbar = Application.CommandBars.Add(POPNAME, msoBarPopup)
 
    nRowCount = 2
    With mnuWs
        Do Until IsEmpty(.Cells(nRowCount, 1))
 
            Select Case UCase(.Cells(nRowCount, 1))
                Case "POPUP"
                    Set cmdbarPopup = cmdbar.Controls.Add(msoControlPopup)
                        cmdbarPopup.Caption = .Cells(nRowCount, 2)
                        If .Cells(nRowCount, 3) <> "" Then
                            cmdbarPopup.BeginGroup = True
                        End If
 
                Case "BUTTON"
                    Set cmdbarBtn = cmdbarPopup.Controls.Add(msoControlButton)
                        cmdbarBtn.Caption = .Cells(nRowCount, 2)
                        If .Cells(nRowCount, 3) <> "" Then
                            cmdbarBtn.BeginGroup = True
                        End If
                        cmdbarBtn.FaceId = .Cells(nRowCount, 4)
                        cmdbarBtn.OnAction = .Cells(nRowCount, 5)
 
                Case "BUTTON_STANDALONE"
                    Set cmdbarBtn = cmdbar.Controls.Add(msoControlButton)
                        cmdbarBtn.Caption = .Cells(nRowCount, 2)
                        If .Cells(nRowCount, 3) <> "" Then
                            cmdbarBtn.BeginGroup = True
                        End If
                        cmdbarBtn.FaceId = .Cells(nRowCount, 4)
                        cmdbarBtn.OnAction = .Cells(nRowCount, 5)
 
            End Select
            nRowCount = nRowCount + 1
        Loop
    End With
 
End Sub
 
Sub unloadPopup()
    On Error Resume Next
    Application.CommandBars(POPNAME).Delete
End Sub
 
Sub showAbout()
    MsgBox "This is a sample on how to customize the QAT on the fly!!", vbInformation
End Sub
 
Sub showHelp()
    On Error GoTo Err_Handler
    ThisWorkbook.FollowHyperlink "http://www.msofficegurus.com", , True, True
    Exit Sub
 
Err_Handler:
    MsgBox Err.Description, vbCritical, Err.Number
 
End Sub

最后,需要编写回调的代码。使用onLoad事件调用loadPopup过程,以便创建弹出菜单,并准备当在QAT中单击该按钮时使用,也包含当发生单击时显示弹出菜单的单击事件代码:

Dim grxIRibbonUI        As IRibbonUI
 
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    On Error Resume Next
    Set grxIRibbonUI = ribbon
 
    Application.Workbooks.Add
    If ActiveWorkbook.Name <> ThisWorkbook.Name Then
        With ActiveWorkbook
            .Saved = True
            .Close
        End With
    End If
 
'   可以在这个事件或者ThisWorkbook的Open事件中装载弹出菜单
    Call loadPopup
End Sub
 
Sub rxbtnShowPopup_Click(control As IRibbonControl)
    On Error Resume Next
    Application.CommandBars(POPNAME).ShowPopup
End Sub
 
Sub rxbtnHappy_Click(control As IRibbonControl)
    MsgBox "This is Mr. Happy Face... hurray!!", vbExclamation
End Sub

定制QAT时的一些注意事项
虽然在QAT中可以方便地实现自定义,但也有一些缺陷。
(1)无法装载控件
上文中曾经谈到,在定制好后,例如按钮和组,打开工作簿时,却发现定制的控件没有出现。这种情况在使用sharedControls时非常普遍。
一种解决方法是先最小化工作簿,然后再最大化,通过刷新来使定制的控件出现;或者再打开一个工作簿后,将其关闭,看看定制的控件是否出现。
(2)无法为控件装载自定义图像
共享控件的表现通常无法预料,并且不能提供可信赖且一致的界面,因此建议在共享控件中尽量不要使用自定义图像。
至于文档控件,可以使用下面的过程刷新包含UI的窗口来解决此类问题:

Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    Set grxIRibbonUI = ribbon
    On Error Resume Next
    Application.Workbooks.Add
    If ActiveWorkbook.Name <> ThisWorkbook.Name Then
        With ActiveWorkbook
            .Saved = True
            .Close
        End With
    End If
End Sub

上述技巧也能用于无法装载自定义控件中。
(3)复制控件
在QAT中控件的复制通常发生在工作簿或文档之间切换时。假设有一个包含定制的QAT的工作簿,当按Alt+Tab移动到另一个文档,然后返回定制的工作簿时,在QAT中的控件被复制、三次复制、四次复制……这种复制能够被传播到没有包含任何XML定制的其它工作簿和文档。
此时,需要关闭后重新打开文档才能消除这种不应有的复制。

相关文章

细品RibbonX(3):认识快速访问工具栏(QAT)

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 5.00 out of 5)
Loading ... Loading ...

QAT概述
快速访问工具栏是唯一与以前版本的工具栏相仿的Office 2007界面元素,默认情况下,快速访问工具栏位于界面上方、Office按钮右侧,如下图1所示。可以在快速访问工具栏中放置经常需要使用的命令,以方便快速访问。
RibbonX(3)-1
图1:快速访问工具栏(QAT)
与以前版本的工具栏相似,您可以自定义快速访问工具栏,在其中放置经常使用的命令控件,以方便通过直接单击来使用其功能。然而,与以前版本工具栏不同的是,快速访问工具栏只能放置在功能区的上方或下方,不能随意放置或悬浮在界面上,从而消除了管理工具栏的复杂性。
放置QAT
默认情况下,快速访问工具栏在功能区上方,您也可以将其放置在功能区的下方。在快速访问工具栏中单击右键,选择“在功能区下方显示快速访问工具栏”,将快速访问工具栏移至功能区下方,如图2所示。
RibbonX(3)-2
图2:在功能区下方放置快速访问工具栏(QAT)
在QAT中添加命令
在QAT中可以随意添加常用的或自已喜欢的命令,且添加的过程比以前的版本更简单和容易。可以使用下列任一方式在QAT中添加命令:

  • 单击QAT右侧下拉图标(如图1所示),选择“其他命令”。
  • 单击“Office按钮——<应用程序>选项——自定义”。
  • 在QAT或Ribbon或选项组中单击右键,选择“自定义快速访问工具栏”。
  • 上述三种方式都会出现如图3所示的“<应用程序>选项”对话框,在其中可以选择要在快速访问工具栏中添加或删除的命令。
    RibbonX(3)-3
    图3:自定义快速访问工具栏(QAT)对话框

  • 右击希望添加到快速访问工具栏的命令,选择“添加到快速访问工具栏”。这可能是最快捷的方式。

看看QAT中的命令
在图3中,有一个自定义快速访问工具栏下拉列表框,从中可以确定将添加的命令用于所有文档,还是只用于指定的文档。是共享控件(Shared Control)还是文档控件(Document Control)也可从QAT中看出来,如图4所示。共享控件和文档控件的图标稍微有点差异,控件周围的小框表明该控件是文档控件。
RibbonX(3)-4
图4:QAT中的命令作用范围不同
共享控件能够用于所有打开的文档,而文档控件只能用于该控件所在的文档。
此外,在QAT中不仅可以添加命令按钮,而且还可以添加组、库等,并且也可以添加自定义的命令。还可以在图标之间添加分隔符,从逻辑上对图标分组。
提示:在图3所示的选项对话框中,右侧指向下的箭头代表组、向右的箭头代表库、带有向右箭头的垂直条代表拆分按钮。
在QAT中添加自定义功能
如果是从头开始创建功能区,那么可能需要使和XML来自定义快速访问工具栏。然而,如果您仅仅希望在快速访问工具栏中添加带有自定义功能的按钮,那么可以按照以下步骤实现:
1、调出如图3所示的“自定义快速访问工具栏”对话框。
2、在对话框左侧的“从下列位置选择命令”组合框中,选择“宏”,此时在下方将显示所有可用的宏列表。
3、在对话框右侧的“自定义快速访问工具栏”组合框中选择宏的作用范围(即用于当前文档还是用于所有文档)。
4、从宏列表中选择所需要的宏,单击“添加”按钮。如图5所示。
5、单击“确定”按钮。
RibbonX(3)-5
图5:在快速访问工具栏(QAT)中添加自定义命令
您可能对自定义命令的图标不太满意,此时可以单击图5中的“修改”按钮来修改图标。单击“修改”按钮后,出现如下图6所示的“修改按钮”对话框,从中您可以选择喜欢的图标,在下方的“显示名称”文本框中,可以修改当鼠标悬浮在自定义按钮上时所显示的提示文本。
RibbonX(3)-6
图6:修改自定义按钮的图标及提示
RibbonX(3)-7
图7:在QAT中添加的自定义按钮,鼠标悬浮在其上方时会显示在图6中输入的文本提示
模仿Excel 2003界面
可以在Excel 2007中模仿Excel 2003的菜单和工具栏界面,如图8所示。
RibbonX(3)-8
图8:模仿Excel 2003界面
实际上,在图8中,将Excel 2007的功能区最小化,然后在功能区下方放置快速访问工具栏,并按照以前的Excel版本中的“常用”和“格式”工具栏顺序在快速访问工具栏中依次放置相应的命令,从而达到模仿Excel 2003界面的效果。
重置快速访问工具栏
如果您设置了快速访问工具栏,而现在希望将其恢复到默认状态,那么您可以单击图5所示的对话框中的“重设”按钮即可。
也可以重新排列快速访问工具栏中图标的顺序。在图5所示对话框的最右侧,有一个箭头向上和一个箭头向下的按钮,在选中命令后,单击这两个按钮即可调整命令放置的顺序。
当然,您也可以很容易删除快速访问工具栏中的命令,在图5所示对话框中有一个“删除”按钮,选中需要删除的命令后,单击此按钮即可。最简单的方法是,直接右击该命令,选择“从快速访问工具栏删除”。
QAT文件
Excel会将自定义QAT的信息存储在名为excel.qat的文件中,该文件位于:
C:\Documents and Settings\<用户名>\Local Settings\Application Data\Microsoft\Office
文件夹内。
可以使用记事本等文本编辑器或XML编辑器来查看该文件,也可编辑该文件。并且,一旦修改了快速访问工具栏,该文件就会立即更新。
如果您已经定制好的快速访问工具栏,可以将该文件复制给他人,与他人共享您定制的成果。

相关文章