ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: jiulongpo

[分享] 细品RibbonX(1-59) (转)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:09 | 显示全部楼层
本帖已被收录到知识树中,索引项:UI界面定制
本帖最后由 jiulongpo 于 2012-8-6 20:54 编辑

转自: http://www.excelperfect.com/index.php/2009/11/12/ribbonxstudy34/
细品RibbonX(34):menuSeparator元素详解


menuSeparator元素有些像separator元素和labelControl元素的混合,可以为特定类型的菜单控件创建一条水平线,并且能够提供文本。这使得能够在菜单项之间添加标题。
1menuSeparator元素必需的属性
menuSeparator元素需要下表1所列的id属性之一。
表1:menuSeparator元素必需的属性
属性

何时使用

id

当创建自已的菜单分隔条时

idQ

当在命名空间之间创建共享的菜单分隔条时

2、带有回调签名的可选的静态属性和动态属性
menuSeparator控件相对于已存在的控件的放置需要使用下表2列出的insert属性之一。
表2:menuSeparator元素可选的insert属性
INSERT属性

允许值

默认值

何时使用

insertAfterMso

有效的Mso组

在组末尾插入

在Microsoft控件之后插入

insertBeforeMso

有效的Mso组

在组末尾插入

在Microsoft控件之前插入

insertAfterQ

有效的组idQ

在组末尾插入

在共享的命名空间控件之后插入

insertBeforeQ

有效的组idQ

在组末尾插入

在共享的命名空间控件之前插入

menuSeparator元素接受下表3所列的title元素或等价的回调。
表3:menuSeparator元素可选的属性和回调
静态属性

动态属性

允许值

默认值

动态属性的VBA回调签名

title

getTitle

1至1024个字符

line

Sub GetTitle(control As
IRibbonControl,
ByRef returnedVal)

3menuSeparator元素允许的子对象
menuSeparator元素不支持任何类型的子控件。
4menuSeparator元素的父对象
在下列任何控件内都能放置menuSeparator控件:
n         menu
n         officeMenu
n         dynamicMenu
5、创建自定义的menuSeparator元素
(1)创建一个新的.xlsx文件,并将其保存为Excel menuSeparator Example.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab id=“tabDemo“
                 label=“Demo“
                 insertBeforeMso=“TabHome“>
                 <group id=“grpSaveFiles“
                      label=“Save File“>
                      <menu id=“mnuNewFile“
                         label=“Save As File Type“
                         size=“large“
                         imageMso=“FileCompatibilityChecker“>
                      <menuSeparator id=“rxmSep01“
                         title=“Save in 2007 format“/>
                      <button idMso=“FileSaveAsExcelXlsx“/>
                      <button idMso=“FileSaveAsExcelXlsxMacro“/>
                      <menuSeparator id=“rxmSep02“/>
                      <button idMso=“FileSaveAsExcelXlsb“/>
                      <menuSeparator id=“rxmSep03“
                         title=“Save in 97-2003 format“/>
                      <button idMso=“FileSaveAsExcel97_2003“/>
                      <menuSeparator id=“rxmSep04“
                         title=“Save in other format“/>
                      <button idMso=“FileSaveAsOtherFormats“/>
                      </menu>
                 </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
注意,rxmSep02没有指定title属性,这将创建一条细线来分隔菜单项,而不是带有线条的标题栏。
(4)保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,结果如下图所示。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 jiulongpo 于 2012-8-7 20:55 编辑

转自: http://www.excelperfect.com/index.php/2009/11/13/ribbonxstudy35/
细品RibbonX(35):dialogBoxLauncher元素详解


dialogBoxLauncher是一个小的、几乎看不见的、能够在组中使用的“小玩意”。在界面上是一个带有箭头的小正方形,位于组的右下角。
在大多数情形下,dialogBoxLauncher通过启动内置对话框,提供给用户更多的选项。当然,您也可以创建自已的用户窗体,提供给用户额外的选项或者帮助文档。
1dialogBoxLauncher元素必需和可选的属性
dialogBoxLauncher元素没有任何必需的和可选的属性,其依赖于拥有属性的子对象。
2dialogBoxLauncher元素允许的子对象
dialogBoxLauncher是一个容器,因此不仅接受子对象,而且需要子对象实现功能。dialogBoxLauncher必须具有且仅有一个按钮作为其子对象。实际上,按钮的作用是启动应用程序对话框。
3dialogBoxLauncher元素的父对象
使用dialogBoxLauncher的唯一的地方是组。
4dialogBoxLauncher元素使用示例
在UI中,有三种不同的方式实现dialogBoxLauncher:
n         使用Microsoft已经使其可用的缺省的对话框启动器之一
n         创建自定义启动器来使用Microsoft的其它对话框之一
n         创建自定义启动器来启动自定义用户窗体
内置的对话框启动器
在自定义组中添加对话框启动器最简单的方式是使用Microsoft内置的对话框启动器按钮作为其子对象。
(1)创建一个新的.xlsx文件,并将其保存为Excel dialogBoxLauncher Example.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>

  2. <ribbon

  3.     startFromScratch=“false“>

  4.     <tabs>

  5.        <tab id=“rxtabDemo“

  6.            label=“Demo“

  7.            insertBeforeMso=“TabHome“>

  8.            <group id=“rxgrpTest“

  9.               label=“Test“>

  10.               <box id=“rxboxFormat“>

  11.                   <comboBox idMso=“Font“ />

  12.                   <comboBox idMso=“FontSize“ />

  13.               </box>

  14.               <dialogBoxLauncher>

  15.                   <button idMso=“FormatCellsFontDialog“/>

  16.               </dialogBoxLauncher>

  17.            </group>

  18.        </tab>

  19.     </tabs>

  20. </ribbon>

  21. </customUI>
复制代码

注意,dialogLauncher仅仅是包含一个按钮的壳。使用dialogBoxLauncher的技巧是确保使用了正确的内置对话框按钮。
(4)保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,单击“Test”组右下角的对话框启动器,结果如下图所示。


使用内置对话框的自定义对话框启动器
(1)创建一个新的.xlsm文件,并将其保存为Excel dialogBoxLauncher Example1.xlsm。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>

  2. <ribbon

  3.     startFromScratch=“false“>

  4.     <tabs>

  5.        <tab id=“rxtabDemo“

  6.            label=“Demo“

  7.            insertBeforeMso=“TabHome“>

  8.            <group id=“rxgrpTest“

  9.               label=“Test“>

  10.               <box id=“rxboxFormat“>

  11.                   <comboBox idMso=“Font“ />

  12.                   <comboBox idMso=“FontSize“ />

  13.               </box>

  14.               <dialogBoxLauncher>

  15.                   <button id=“rxbtnDialog“

  16.                                       onAction=“rxbtnDialog_click“

  17.                                       screentip=“Launch Dialog“/>

  18.               </dialogBoxLauncher>

  19.            </group>

  20.        </tab>

  21.     </tabs>

  22. </ribbon>

  23. </customUI>
复制代码

注意,没有与按钮相关的图像。即使您提供了按钮图像,它也会被对话框启动器图像覆盖。
(4)生成回调签名并复制,保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,打开VBE,插入一个新模块,粘贴回调签名代码。
(6)编写回调代码:
‘rxbtnDialog onAction回调
Sub rxbtnDialog_click(control As IRibbonControl)
     Application.Dialogs(xlDialogFormatFont).Show
End Sub
编写代码较困难的是找到合适的对话框常量(本例中为xlDialogFormatFont),您可以使用对象浏览器或者智能感知功能来查找。
(7)关闭工作簿后重新打开。单击“Test”组右下角的对话框启动器,将出现“字体”对话框。
当然,您也可以修改回调代码中的对话框常量,调用其它对话框。
使用自定义用户窗体的自定义对话框
(1)创建一个新的.xlsm文件,并将其保存为Excel dialogBoxLauncher Example2.xlsm。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码(即沿用前一示例):
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>

  2. <ribbon

  3.     startFromScratch=“false“>

  4.     <tabs>

  5.        <tab id=“rxtabDemo“

  6.            label=“Demo“

  7.            insertBeforeMso=“TabHome“>

  8.            <group id=“rxgrpTest“

  9.               label=“Test“>

  10.               <box id=“rxboxFormat“>

  11.                   <comboBox idMso=“Font“ />

  12.                   <comboBox idMso=“FontSize“ />

  13.               </box>

  14.               <dialogBoxLauncher>

  15.                   <button id=“rxbtnDialog“

  16.                                       onAction=“rxbtnDialog_click“

  17.                                       screentip=“Launch Dialog“/>

  18.               </dialogBoxLauncher>

  19.            </group>

  20.        </tab>

  21.     </tabs>

  22. </ribbon>

  23. </customUI>
复制代码

(4)生成回调签名并复制,保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,打开VBE,插入一个新模块,粘贴回调签名代码。
(6)插入一个新的用户窗体,在其中添加标签和按钮。修改标签和按钮,如下图所示。
添加按钮单击事件:
Private Sub CommandButton1_Click()
    Unload Me
End Sub
表明当单击按钮后卸载用户窗体。
(7)编写回调代码,使用户单击对话框启动器时启动自定义的用户窗体:
‘rxbtnDialog onAction回调
Sub rxbtnDialog_click(control As IRibbonControl)
     UserForm1.Show
End Sub
8)关闭工作簿后重新打开。单击“Test”组右下角的对话框启动器,将显示刚才自定义的用户窗体。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jiulongpo 于 2012-8-6 20:56 编辑

转自: http://www.excelperfect.com/index.php/2009/11/17/ribbonxstudy36/
细品RibbonX(36):keytip属性详解


keytip能够使用户通过键盘导航功能区。这是不喜欢使用鼠标的用户非常喜欢的功能,也有助于使用户界面更易访问。
按Alt键将进入键击导航模式,显示可用的键击名,能使用户导航选项卡、组和控件层次。简单地按下代表某命令的字符,将激活该命令。
keytip属性接受至多三个字符。由于其目的是使UI通过键盘比使用鼠标访问更有效,因此应该使其尽可能简短。并且,键击名与其要激活的控件名越不相关,用户要记住也就越难,因此就越不会使用。
如下图所示,按下Alt键,进入键击导航模式。

如果再按下代表开始选项卡的H键,将呈现该选项卡每个命令的快捷键,如下图所示。

然后,按下相应的字母键或数字键,就会执行相应的命令。
虽然记住所有的命令是不可能的,但是Microsoft已经为我们提供了一种容易的显示键击的方式。
创建keytip
要创建自已的keytip属性,只需在XML结构的父元素中添加适当的keytip=”abc”标签。
(1)创建一个新的.xlsx文件,并将其保存为Excel keytip Example.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui”>
    <ribbon startFromScratch=”false”>
        <tabs>
            <tab id=”rxtabDemo”
               label=”Demo”
               keytip=”cD”
               insertBeforeMso=”TabHome”>
               <group id=”rxgrpDemo”
                  label=”Demo Group”>
                  <button id=”rxbtnDemo”
                  label=”Testing”
                  keytip=”B”
                  imageMso=”HappyFace”/>
               </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
上述代码简单地创建了一个包含笑脸按钮的新组。
(4)保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,按下Alt键之后,结果如下图所示。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jiulongpo 于 2012-8-6 20:56 编辑

转自: http://www.excelperfect.com/index.php/2009/11/24/ribbonxstudy37/
细品RibbonX(37):screentip属性和supertip属性详解


当用户悬浮鼠标在控件上时,screentip属性和supertip属性能够为控件提供有帮助的文本,与用户共享信息,指出该控件的目的。使用screentip告诉用户控件是什么,使用supertip提供稍微更长一点信息,解释该控件做什么。下图为一个示例。

screentip部分是框顶部给出键盘快捷键的粗线,而supertip是其剩下的信息。
然而,Microsoft不会让我们在supertip中添加自已的图像
创建screentip属性和supertip属性
(1)创建一个新的.xlsx文件,并将其保存为CustomKeytip.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon startFromScratch="false">
    <tabs>
        <tab id="rxtabDemo"
                label="Demo"
                keytip="cD"
                insertBeforeMso="TabHome">
                <group id="rxgrpDemo"
                        label="Demo Group">
                  <button id="rxbtnDemo"
                    label="Testing"
                    screentip="This is very accurate information!"
                    supertip="It tells you nothing... which is exactly what this button does!"                    
                    imageMso="HappyFace"/>
                </group>
        </tab>
    </tabs>
</ribbon>
</customUI>

(4)保存后关闭CustomUI Editor。
(5)在Excel中重新打开该文件,将鼠标悬浮在自定义按钮上,结果如下图所示。

当在XML中使用跨多行的文本时,tab字符能够用于排列XML代码而不会影响用户看到的文字。然而,输入额外的硬回车或空格将在属性显示的文本中插入空格。
如果希望在输出的文本中强迫换行,则需要在XML中添加字符。这五个字符强迫在输出中硬回车。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 jiulongpo 于 2012-8-6 20:57 编辑

转自: http://www.excelperfect.com/index.php/2009/11/25/ribbonxstudy38/
细品RibbonX(38):覆盖内置控件的属性


很多时候,我们都希望使用Microsoft的内置控件,但有时其标签并不一定反映出我们的目的,因此需要重命名它们。
例如,在Excel中,“开始”选项卡的键击键是“H”,我们想将其修改为“S”。XML代码如下:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
        <tabs>
            <tab idMso="TabHome"
               keytip="S">
            </tab>
        </tabs>
</ribbon>
</customUI>

结果如下图所示。

也能够修改其它控件的一些内置属性,最常用的是重命名按钮或者隐藏其标签。
然而,Microsoft不允许修改内置组的任何属性。例如,下面的XML代码:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <ribbon startFromScratch="false">
        <tabs>
                <!-- Enter your first tab here -->
                <tab id="rxTabHome">
                        <group idMso="GroupFont"
                                 visible="false"/>
                </tab>
        </tabs>
    </ribbon>
</customUI>

原本想使“开始”选项卡中的“字体”组隐藏,但结果“字体”组仍然存在于界面中。如果能够使组隐藏,那么我们就可以将选项卡中不常使用的组隐藏起来了。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:20 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:57 编辑

转自: http://www.excelperfect.com/index.php/2009/11/27/ribbonxstudy39/
细品RibbonX(39):技巧—使用VBA自定义功能区元素属性


除了使用类创建自定义属性外,也可以为许多对象(例如工作簿、工作表,等)创建自定义属性。此外,在给对象定义自定义属性之后,属性作为对象的成员被公开,例如:
ThisWorkbook.MyRibbon

正如所见,从父对象直接引用UI对象非常容易,当引用回Ribbon对象时可以省去很多麻烦。考虑到用户经常同时打开多个应用程序,每个程序都会有一个名为MyRibbon的对象,因此让代码可以清楚地指定引用的确切对象是至关重要的。
设置自定义属性
设置内置对象的自定义属性与使用标准的类模块创建自定义属性相同。唯一不同的是,属性必须驻留在其容器对象里,以便属性能够作为该指定对象的成员公开。
可以使用自定义属性模拟上下文选项卡来容易地访问可视的属性、确定标签值,等等。下面的示例中,我们开发自定义属性来控制可见性。该示例实现下列功能:


  • 显示/隐藏与工作表相关的选项卡的自定义属性
  • 两个复选框,控制两个内置组的可见性(字体和表)
本例中,关键属性是getVisible属性,我们将使之变成自定义属性以便通过该属性修改其值。注意,通过这些自定义属性将显示/隐藏位于不同选项卡里的组。
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
  2.           onLoad="rxIRibbonUI_onLoad">
  3.     <ribbon startFromScratch="false">
  4.         <tabs>
  5.             <tab id="rxtabSheet"
  6.                  label="Sheet Tab"
  7.                  insertBeforeMso="TabHome"
  8.                  getVisible="rxtabSheet_getVisible">
  9.                 <group id="rxgrp1"
  10.                        label="My Custom Group">
  11.                 </group>
  12.              </tab>
  13.              <tab idMso="TabHome"
  14.                   label="Modified Home">
  15.                  <group id="rxgrp2"
  16.                         insertBeforeMso="GroupClipboard"
  17.                         label="My CheckBox">

  18.                  <!-- Add a checkBox -->
  19.                  <checkBox id="rxchkHideFontGroup"
  20.                         getLabel="rxchkHideFontGroup_getLabel"
  21.                         onAction="rxchkHideFontGroup_Click"
  22.                         screentip="Hide the Font Group"
  23.                         supertip="Click here to hide/unhide the Font Group"/>

  24.                  <!-- Add a checkBox -->
  25.                  <checkBox id="rxchkHideTableGroup"
  26.                         getLabel="rxchkHideTableGroup_getLabel"
  27.                         onAction="rxchkHideTableGroup_Click"
  28.                         screentip="Hide the Tables Group"
  29.                         supertip="Click here to hide the Tables Groups"/>
  30.                  </group>
  31.              </tab>
  32.              <tab idMso="TabHome">
  33.                  <group idMso="GroupFont"
  34.                       getVisible="GroupFont_getVisible"/>
  35.              </tab>
  36.              <tab idMso="TabInsert">
  37.                  <group idMso="GroupInsertTablesExcel"
  38.                       getVisible="GroupInsertTablesExcel_getVisible"/>
  39.              </tab>
  40.         </tabs>
  41.     </ribbon>
  42. </customUI>
复制代码

上述代码创建了“Modified Home”选项卡,在剪贴板前添加了“My CheckBox”组,并且添加了一个名为“Sheet Tab”的空选项卡,界面如下图所示。

接下来,定义属性。在ThisWorkbook对象中定义下列属性:
  1. Private pRibbonUI As IRibbonUI
  2. Private pblnGrpTblVisible As Boolean
  3. Private pblnGrpFontVisible As Boolean

  4. '设置Ribbon对象,使之能够作为ThisWorkbook的成员访问
  5. Public Property Let rxIRibbonUI(iRib As IRibbonUI)
  6.     Set pRibbonUI = iRib
  7. End Property

  8. Public Property Get rxIRibbonUI() As IRibbonUI
  9.     Set rxIRibbonUI = pRibbonUI
  10. End Property

  11. '设置可见性属性,使之能够作为ThisWorkbook的成员访问
  12. Public Property Let rxIRibbonUIGroupTableVisible( _
  13.     ByVal blnVisible As Boolean)
  14.     pblnGrpTblVisible = blnVisible
  15. End Property

  16. Public Property Get rxIRibbonUIGroupTableVisible() As Boolean
  17.     rxIRibbonUIGroupTableVisible = pblnGrpTblVisible
  18. End Property

  19. Public Property Let rxIRibbonUIGroupFontVisible( _
  20.     ByVal blnVisible As Boolean)
  21.     pblnGrpFontVisible = blnVisible
  22. End Property

  23. Public Property Get rxIRibbonUIGroupFontVisible() As Boolean
  24.     rxIRibbonUIGroupFontVisible = pblnGrpFontVisible
  25. End Property
复制代码

注意,虽然用于决定可见性的这些变量在ThisWorkbook模块,但由于ThisWorkbook对象可以在本工程的任何地方访问,因此可以在该模块之外设置或获取这些属性的值。
在编写回调代码之前,还需要为工作表创建自定义属性,然后使用这些属性来决定与该工作表相关的选项卡是否显示,这里使用工作表Sheet1,当然您可以根据需要修改。
使用下列代码为该工作表设置自定义属性:
  1. Private pglnTabVisible As Boolean

  2. Property Let rxIRibbonUISheetTabVisible(ByVal blnVisible As Boolean)
  3.     pglnTabVisible = blnVisible
  4. End Property

  5. Property Get rxIRibbonUISheetTabVisible() As Boolean
  6.    rxIRibbonUISheetTabVisible = pglnTabVisible
  7. End Property

  8. Private Sub Worksheet_Activate()
  9.     Sheet1.rxIRibbonUISheetTabVisible = True
  10.     ThisWorkbook.rxIRibbonUI.Invalidate
  11. End Sub

  12. Private Sub Worksheet_Deactivate()
  13.     Sheet1.rxIRibbonUISheetTabVisible = False
  14.     ThisWorkbook.rxIRibbonUI.Invalidate
  15. End Sub
复制代码

注意,现在可以利用我们为ThisWorkbook创建的自定义属性来使Ribbon无效。我们不再将该属性作为普通的对象,相反我们将其作为属性即ThisWorkbook对象的一个成员。因此,该UI是ThisWorkbook的一部分。
最后,编写回调代码:
  1. Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
  2.     ThisWorkbook.rxIRibbonUI = ribbon
  3. End Sub

  4. Sub rxtabSheet_getVisible(control As IRibbonControl, ByRef returnedVal)
  5.     returnedVal = Sheet1.rxIRibbonUISheetTabVisible
  6. End Sub

  7. Sub rxchkHideFontGroup_Click(control As IRibbonControl, pressed As Boolean)
  8.     ThisWorkbook.rxIRibbonUIGroupFontVisible = pressed
  9.     ThisWorkbook.rxIRibbonUI.Invalidate
  10. End Sub

  11. Sub rxchkHideTableGroup_Click(control As IRibbonControl, pressed As Boolean)
  12.     ThisWorkbook.rxIRibbonUIGroupTableVisible = pressed
  13.     ThisWorkbook.rxIRibbonUI.Invalidate
  14. End Sub

  15. Sub GroupFont_getVisible(control As IRibbonControl, ByRef returnedVal)
  16.     returnedVal = True
  17.     If control.ID = "GroupFont" Then
  18.         returnedVal = Not (ThisWorkbook.rxIRibbonUIGroupFontVisible)
  19.     Else
  20.        ThisWorkbook.rxIRibbonUI.Invalidate
  21.     End If
  22. End Sub

  23. Sub GroupInsertTablesExcel_getVisible(control As IRibbonControl, ByRef returnedVal)
  24.     returnedVal = True
  25.     If control.ID = "GroupInsertTablesExcel" Then
  26.         returnedVal = Not (ThisWorkbook.rxIRibbonUIGroupTableVisible)
  27.     Else
  28.         ThisWorkbook.rxIRibbonUI.Invalidate
  29.     End If
  30. End Sub

  31. Sub rxchkHideFontGroup_getLabel(control As IRibbonControl, ByRef returnedVal)
  32.     Select Case ThisWorkbook.rxIRibbonUIGroupFontVisible
  33.         Case True
  34.             returnedVal = "Show Font Group"
  35.         Case False
  36.             returnedVal = "Hide Font Group"
  37.     End Select
  38. End Sub

  39. Sub rxchkHideTableGroup_getLabel(control As IRibbonControl, ByRef returnedVal)
  40.     Select Case ThisWorkbook.rxIRibbonUIGroupTableVisible
  41.         Case True
  42.             returnedVal = "Show Table Group"
  43.         Case False
  44.             returnedVal = "Hide Table Group"
  45.     End Select
  46. End Sub
复制代码

现在,你可以通过自定义属性来定义与UI对象相关的不同的属性。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:27 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:58 编辑

转自: http://www.excelperfect.com/index.php/2009/11/30/ribbonxstudy40/
细品RibbonX(40):技巧—在注册表中保存值和从注册表中获取值


Windows注册表是一个数据库,用于存储与计算机不同方面相关的设置,例如用户设置、应用程序设备、硬件设置,等等。
VBA提供了与注册表直接交互的方式,这不仅允许我们获取其它程序和硬件的信息,而且也能够使我们选择应用程序中的重要信息并将其存储在注册表中。
本文中,我们的目的是存储和获取关于UI的信息,我们将使用专门为VBA(和VB)配置而留出的部分。并且,我们不需要使用Windows APIs。
VBA提供了用于处理注册表的两个函数:GetSetting和SaveSetting,这两个函数仅能访问下面的注册表句柄键:
    HKEY_CURRENT_USER\Software\VB and VBA Program Settings

如下图所示,当切换按钮时,即使关闭了该工程,其状态值仍保存,因此,在重新打开该工程时,按钮的状态为关闭前的状态,不会因为关闭工程而使按钮的状态值丢失。

定义上图所示界面的XML代码如下:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
  2.     onLoad="rxIRibbonUI_onLoad">
  3.     <ribbon startFromScratch="false">
  4.         <tabs>
  5.             <tab idMso="TabHome">
  6.                 <group id="rxgrp1"
  7.                    insertBeforeMso="GroupClipboard"
  8.                    label="Toggle Custom Tabs">
  9.                     <toggleButton id="rxtglCustomReview"
  10.                        label="Toggle Custom Review Tab"
  11.                        imageMso="ReviewAcceptChangeMenu"
  12.                        size="large"
  13.                        getPressed="rxtglCustomReview_getPressed"
  14.                        onAction="rxtglShared_Click"/>
  15.                     <separator id="rxsep1"/>
  16.                     <toggleButton id="rxtglDataHandling"
  17.                        label="Toggle Data Handling Tab"
  18.                        imageMso="Consolidate"
  19.                        size="large"
  20.                        getPressed="rxtglDataHandling_getPressed"
  21.                        onAction="rxtglShared_Click"/>
  22.                 </group>
  23.             </tab>
  24.             <!-- THE CUSTOM REVIEW TAB UI STARTS HERE -->
  25.             <tab id="rxtabCustomReview"
  26.                  getVisible="rxtabCustomReview_getVisible"
  27.                  label="Custom Review"
  28.                  keytip="K">
  29.                 <group idMso="GroupClipboard"/>
  30.                 <group idMso="GroupFont"/>
  31.                 <group id="rxgrpProofingComments"
  32.                   label="Proofing and Comments">
  33.                   <box id="rxbox1" boxStyle="vertical">
  34.                       <button idMso="Spelling"/>
  35.                       <button idMso="Thesaurus"/>
  36.                       <button idMso="TranslationPane"/>
  37.                   </box>
  38.                   <separator id="rxsep2"/>
  39.                   <box id="rxbox2" boxStyle="vertical">
  40.                       <button idMso="ReviewNewComment"/>
  41.                       <button idMso="ReviewDeleteComment"
  42.                           label="Delete Comment"/>
  43.                       <toggleButton idMso="ReviewShowAllComments"/>
  44.                   </box>
  45.                 </group>
  46.                 <group id="rxgrpChanges"
  47.                    label="Worksheet related changes">
  48.                    <box id="rxbox" boxStyle="vertical">
  49.                        <button idMso="ReviewHighlightChanges"/>
  50.                        <button idMso="ReviewProtectAndShareWorkbook"/>
  51.                        <button idMso="ReviewAllowUsersToEditRanges"/>
  52.                        <button idMso="SheetProtect"/>
  53.                    </box>
  54.                 </group>
  55.             </tab>
  56.             <!-- END OF CUSTOM REVIEW TAB -->
  57.             <tab id="rxtabDataHandling"
  58.                  getVisible="rxtabDataHandling_getVisible"
  59.                  label="Data Handling"
  60.                  keytip="Z">
  61.             </tab>
  62.         </tabs>
  63.     </ribbon>
  64. </customUI>
复制代码

代码包含了一些必须由VBA处理的关键回调。设置了getPressed属性,因为它返回从注册表中获取toggleButton的按下状态的回调,状态是true或false。
接下来,处理Click事件(该事件通过OnAction属性定义为共享的回调)。每次单击时,都会将按钮当前状态保存到注册表。
最后,getVisible属性根据toggleButton的状态决定是否选项卡可见。
本例中,将下面的两个VBA函数封装到自已的函数中,这样可以传递参数到自定义函数中,并且在一定程度上能够控制程序:
  1. Function getRegistry(ByVal strKey As String) As Boolean
  2.     On Error Resume Next
  3.     getRegistry = GetSetting("AddInProject", "TabVisibility", strKey)
  4.     If Err > 0 Then getRegistry = False
  5. End Function

  6. Function saveRegistry(ByVal strKey As String, _
  7.     ByVal blnSetting As Boolean)
  8.     SaveSetting "AddInProject", "TabVisibility", strKey, blnSetting
  9. End Function
复制代码

因为如果键不存在的话,getRegistry函数将返回错误,所以需要添加错误处理以捕获错误。如果发生错误,那么知道该键不存在,getRegistry函数应该返回False。
回调代码如下:
  1. Public gblnShowCustomReviewTab As Boolean
  2. Public gblnShowCustomDataHandlingTab As Boolean
  3. Public gblnCalledOnOpen As Boolean
  4. Public grxIRibbonUI As IRibbonUI

  5. Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
  6.     Set grxIRibbonUI = ribbon
  7. End Sub

  8. Sub rxtglCustomReview_getPressed(control As IRibbonControl, ByRef returnedVal)
  9.     returnedVal = getRegistry("CustomReviewTab")
  10.     gblnShowCustomReviewTab = getRegistry("CustomReviewTab")
  11.     grxIRibbonUI.InvalidateControl ("rxtabCustomReview")
  12. End Sub

  13. Sub rxtglDataHandling_getPressed(control As IRibbonControl, ByRef returnedVal)
  14.     returnedVal = getRegistry("CustomDataHandlingTab")
  15.     gblnShowCustomDataHandlingTab = getRegistry("CustomDataHandlingTab")
  16.     grxIRibbonUI.InvalidateControl ("rxtabDataHandling")
  17. End Sub

  18. Sub rxtglShared_Click(control As IRibbonControl, pressed As Boolean)
  19.     Select Case control.ID
  20.         Case "rxtglCustomReview"
  21.             gblnShowCustomReviewTab = pressed
  22.             saveRegistry "CustomReviewTab", pressed
  23.             gblnCalledOnOpen = False

  24.         Case "rxtglDataHandling"
  25.             gblnShowCustomDataHandlingTab = pressed
  26.             gblnCalledOnOpen = False
  27.             saveRegistry "CustomDataHandlingTab", pressed
  28.     End Select
  29.     grxIRibbonUI.Invalidate
  30. End Sub

  31. Sub rxtabCustomReview_getVisible(control As IRibbonControl, ByRef returnedVal)
  32.     returnedVal = gblnShowCustomReviewTab
  33.     If Not gblnCalledOnOpen Then
  34.         If gblnShowCustomReviewTab = True Then Application.SendKeys ("%K{RETURN}")
  35.     End If
  36. End Sub

  37. Sub rxtabDataHandling_getVisible(control As IRibbonControl, ByRef returnedVal)
  38.     returnedVal = gblnShowCustomDataHandlingTab
  39.     If Not gblnCalledOnOpen Then

  40.         If gblnShowCustomDataHandlingTab = True Then Application.SendKeys ("%Z{RETURN}")
  41.     End If
  42. End Sub
复制代码

现在,就可以试试了!关闭工作簿后再打开,处理控件的设置将根据记录在注册表键中的值更新。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jiulongpo 于 2012-8-6 20:58 编辑

转自: http://www.excelperfect.com/index.php/2009/12/01/ribbonxstudy41/
细品RibbonX(41):从头开始创建功能区用户界面

从头开始创建用户界面将取消用户界面已经提供的一些易于访问的功能,因此应该谨慎使用。
设置startFromScratch属性
从头开始设计项目的用户界面只需要使用startFromScratch属性,将其值设置为True,XML代码如下:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <ribbon startFromScratch="true">
    </ribbon>
</customUI>

结果如下图所示:

然而,在界面中仍然有一些可供使用的命令。下列命令在Excel中仍可使用:新建、打开、保存、Excel选项、退出Excel。
此外,还可以使用快速访问工具栏(QAT)中的两个选项:在功能区上方/下方显示快速访问工具栏、功能区最小化。
除了上述已经列出的命令外,虽然从头开始设计用户界面时移除了所有的控件,但没有禁用任何内置的命令,即便这些命令没有在功能区中显示,例如可以使用快捷键Ctrl+c复制区域,使用Ctrl+w关闭文档。
同样,可以使用Office 2003中的加速键访问Excel的“设置单元格格式”对话框,即按下“Alt+O+E”键。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:33 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:58 编辑

转自: http://www.excelperfect.com/index.php/2009/12/02/ribbonxstudy42/
细品RibbonX(42):启动时激活功能区中某选项卡


您可能认为所需要做的就是添加一个选项卡,并将其指定放置在“开始”选项卡前面,这样,因为它是功能区中的第一个选项卡,因此会成为默认的选项卡并在打开文档时会自动选择该选项卡。听起来比较合乎逻辑,但事实呢?缺省情况下会选择自定义选项卡,因此只是在“开始”选项卡之前添加自定义选项卡并不意味着因为它是功能区中的第一个选项卡就选择该选项卡,至少在Excel中不是这样。
在启动文档时选择某选项卡需要两步。第一步是在XML代码中定义键击键。第二步是编写一个过程,使用SendKeys方法发送键击键到应用程序,执行在文档启动时选择该选项卡的功能。
第一步:添加XML代码。
  1.         <tab id="rxtab"
  2.             label="Active Tab"
  3.             insertBeforeMso="TabHome"
  4.             keytip="UN">
复制代码

第二步:在文档打开时首先发生的onLoad事件中指定选择选项卡的语句。要在装载UI时选择指定的选项卡,使用SendKeys方法,代码如下:
  1. Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
  2.     Application.SendKeys "%UN{RETURN}"
  3. End Sub
复制代码

百分号代表Alt键,以触发键击键,UN是我们定义的键击键,同时添加了RETURN键以便当选择选项卡时在选项卡里的键击键失去焦点。这样做是因为我们希望该选项卡有焦点,但不希望显示键击键。
下表列出了SendKeys方法中可以使用的组合键。

组合键符号
ALT%
CTRL^
SHIFT+

可以使用上表列出的键与其它任何键形成组合。下表列出了一些其它的键,在使用SendKeys方法和需要键组合时,可能会发现这些键会有用。虽然不区分大小写,但建议使用大写。
表:一些特别的键及其相应的代码

键代码
BACKSPACE{BACKSPACE}或{BS}
BREAK{BREAK}
CAPS LOCK{CAPSLOCK}
DELETE或DEL{DELETE}或{DEL}
DOWN ARROW{DOWN}
END{END}
ENTER~
ENTER(数字键盘){ENTER}
ESC{ESCAPE}或{ESC}
F1至F15{F1}至{F15}
HOME{HOME}
RETURN{RETURN}
TAB{TAB}



TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 19:36 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:59 编辑

转自: http://www.excelperfect.com/index.php/2009/12/04/ribbonxstudy43/
细品RibbonX(43):禁用和重利用功能区中的命令


与以前的版本不一样,Office 2007允许全局地禁用和重利用命令。在过去,禁用命令必需禁用UI中执行该命令的控件的每一单个的实例,这显然是一项巨大的工作。
禁用命令
禁用Office 2007中的命令是非常简单的,最重要的是知道打算禁用的命令的控件名以及这些命令在哪类控件之下。从commands集合中完全禁用某命令,而不是从Ribbon对象和该对象的父容器。试图从父容器里禁用某命令将产生一条错误消息。
例如,假设希望禁用“加粗”命令,可以使用下列代码:
  1.     <commands>
  2.         <command idMso="Bold"
  3.                  enabled="false"/>
  4.     </commands>
复制代码

就这么简单!关键是确保正确使用了你希望禁用的命令的idMso。
禁用与应用程序选项和退出应用程序相关的命令
虽然应用程序选项和退出应用程序控件属于officeMenu元素,然而不能从officeMenu容器里禁用这两个控件。相反,必须使用command元素,如下所示:
  1.     <commands>
  2.         <command idMso="FileExit"
  3.                  enabled="false"/>
  4.         <command idMso="ApplicationOptionsDialog"
  5.                  enabled="false"/>
  6.     </commands>
复制代码




当要禁用许多控件时,一个更好的选择是共享回调,这样不需要指定每个命令的enabled属性。这种情况下,代码如下所示:
  1.     <commands>
  2.         <command idMso="FileExit"
  3.                  getEnabled="rxshared_getEnabled"/>
  4.         <command idMso="ApplicationOptionsDialog"
  5.                  getEnabled="rxshared_getEnabled"/>
  6.         <command idMso="Bold"
  7.                  getEnabled="rxshared_getEnabled"/>
  8.     </commands>
复制代码

下面来处理回调,禁用控件,代码如下:
  1. Sub rxshared_getEnabled(control As IRibbonControl, ByRef returnedVal)
  2.     returnedVal = False
  3. End Sub
复制代码

重利用与通用控件相关的命令
重利用命令与禁用命令所采取的方式相同,也是在commands集合中进行处理。
同样,重利用命令成功的关键在于知道希望重利用的命令所在的控件。此外,虽然某命令是不可见的,但是如果通过快捷键调用的话,仍然具有所设计的功能。这也带来了一些问题,例如事件的重复触发。
下面,我们来重利用应用程序选项按钮:
  1.         <command idMso="ApplicationOptionsDialog"
  2.                  onAction="rxApplicationOptionsDialog_repurpose"/>
复制代码

回调代码如下:
  1. Sub rxApplicationOptionsDialog_repurpose(control As IRibbonControl, ByRef cancelDefault)
  2.     MsgBox "对不起,Excel选项目前已经被禁用.", vbCritical
  3. End Sub
复制代码

与前面的示例一样,如果多个控件共享相同的回调签名,那么可以使用同一过程。
影响键盘快捷键和键击键
有时,可能希望覆盖掉内置快捷键和键击键。重载键击键是非常简单的,只需引用该控件,然后给它赋新的键击键,如下面的XML代码所示:
    <tab idMso="TabInsert" keytip="$">

通过将“$”赋值给“插入”选项卡作为键击键,从而将其键击键从“I”修改为“$”。如下图所示,尽管使用了特殊字符$,然而仍然显示自定义的结果。

提示:键击键通过“键,然后键”的方式访问,即按下并释放第一个键,然后按第二个键。而快捷键则通过“键加键”的方式访问,即同时按下所有的键。
下面,我们演示重载内置快捷键,例如Ctrl+c。这里介绍使用OnKey方法来重载内置快捷键。OnKey方法用于运行指定的过程,与SendKeys方法类似,因此可以使用与之相同的键代码。但是,OnKey方法稍微有点不同,使用下表所列的参数。

名称必需/可选数据类型描述
Key必需字符串代表键或按键组合的字符串
Procedure可选Variant代表要运行的过程名称的字符串。如果值为””(空文本),当按下键或键组合时没有任何操作,这种形式的OnKey修改了键击的正常结果。如果忽略参数,那么键或键组合将恢复到正常行为(即OnKey方法清除的任何键或键组合以前被赋予的功能)

OnKey方法的通用语法如下:
    Application.OnKey Key,ProcedureName

正如上表如所,参数Key指定计划捕获的键或键组合,而参数ProcedureName指定当按下键或键组合时必须执行的过程名。假设希望捕获打印快捷键(Ctrl+p),可以使用下列代码:
  1. Sub print_override()
  2.     Application.OnKey "^p", "myPrintMsg"
  3. End Sub
复制代码

为了恢复快捷键的正常功能,必须忽略OnKey方法参数中的过程名,如下代码所示:
  1. Sub print_override()
  2.     Application.OnKey "^p"
  3. End Sub
复制代码

该快捷键命名将恢复其默认的功能。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 12:41 , Processed in 0.046178 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表