ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

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

接 细品RibbonX(15):回调(CallBacks)


2、使用全局回调处理
(1)全局回调处理能够用于一次处理几个控件。如果以标准化方式命名全局处理,那么效果将更好,因为可以立即从单个控件中区分全局控件。
(2)使用全局回调的原因是因为某些指令可能重复,甚至当指令不重复时,对某种控件为某项操作共享相同的属性仍有好处,例如onAction属性。此外,如果操作相同,那么过程能组合在单个的回调处理中。
(3)能利用这种优势减少要处理的回调数,即通过通用的回调处理控件本身。
(4)例如,下列对象:tab,group,button,都共享一个通用的属性getLabel。如前所述,当需要对每个控件动态应用值时,不需要在XML代码中为每个控件编写getLabel回调。相反,可以在VBA过程中通过共享任务在单个处理内将它们放在一起,而且因为是回调,所以不需要遍历XML中指定的控件,将自动遍历控件直至所有控件有所需的值。
(5)仍以上节中的示例,在前面的XML代码中修改每个按钮的onAction属性如下:
onAction=”rxshared_click”
将产生单个的回调,用于处理具有onAction属性和共享该签名的任何控件。
接着,在VBA中为每个按钮处理该回调,使用下面的一小段代码:
Sub rxshared_click(control As IRibbonControl)
    MsgBox “您单击了” & control.Tag, vbInformation
End Sub
也能使用Select Case语句分开每个按钮并赋予其特定的代码:
Sub rxshared_click(control As IRibbonControl)
Select Case control.ID
    Case “rxbtnPaste”
      ‘为rxbtnPaste按钮的代码
    Case “rxbtnCopy”
      ‘为rxbtnCopy按钮的代码
    Case “rxbtnCut”
     ‘为rxbtnCut按钮的代码
End Select
End Sub
因此,无需为用户界面中的每个自定义控件处理回调,可以使用全局的(共享的)回调,然后处理VBA过程里的每个控件。这里,使用了Select Case语句,因为该语句简洁且易于理解。也可以使用If…Then…ElseIf…End If语句。
使用户界面组件无效
Ribbon的一个重要方面是使Ribbon无效或指定的控件无效。
某些操作仅当使整个Ribbon无效才能执行,而另一些操作只需通过使指定控件无效来完成。
1、无效能处理什么?为什么需要?
IRibbonUI对象包含两个方法:Invalidate和InvalidateControl。
表:IRibbonUI对象模型
方法
用途
Invalidate()
为更新而标记整个功能区(顺序标记其中的每个控件)
InvalidateControl(strControlID)
为更新而标记特定的控件,被更新的控件作为字符串被传递到方法的参数中。(strControlID)

理解Invalidate方法的关键是该方法使用户界面中每个控件都无效,这意味着强制调用在用户界面中定义的所有回调。此外,也将导致更新所有控件,而无论其是否有回调。当使功能区无效时,在功能区中作出调用,并且在用户界面中指定的每个过程都将运行。
注意,“刷新”指在打开工程时简单地更新在用户界面中已经装载的控件,而“重新装载”指卸载并重新装载用户界面中的整个项目。
除非确实需要作用整个功能区,更好的选择是在执行期间的指定时刻使单个控件无效,即仅使必需的控件无效。
要使整个功能区或功能区中指定的控件无效,需要设置代表IRibbonUI对象的全局变量,可通过在onLoad属性中指定回调来实现:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“ onLoad=“rxIRibbonUI_onLoad“>
</customUI>
接下来,需要编写VBA代码处理在onLoad属性中指定的回调:
Public grxIRibbonUI As IRibbonUI
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
Set grxIRibbonUI=ribbon
End Sub
注意,代表IRibbonUI对象的变量在标准模块的全局声明区中声明,以便于能被工程的其他部分访问。
2、使整个Ribbon无效
步骤1 创建一个新的Excel文件,并保存为启用宏的工作簿。
步骤2 使用CustomUI Editor,在工作簿文件中添加XML代码:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“ onLoad=“rxIRibbonUI_onLoad“>

  2.     <ribbon>

  3.         <tabs>

  4.             <tab id=“rxtabDemo“
  5.                  label=“My Custom Tab“
  6.                  insertBeforeMso=“TabHome“>

  7.                  <group id=“rxgrpDemo“
  8.                         label=“My Demo Group“>

  9.                      <button id=“rxbtn“
  10.                              getLabel=“rxshared_getLabel“
  11.                              size=“normal“
  12.                              onAction=“rxshared_click“
  13.                              imageMso=“FillRight“/>

  14.                      <button id=“rxbtn2“
  15.                              getLabel=“rxshared_getLabel“
  16.                              size=“normal“
  17.                              onAction=“rxshared_click“
  18.                              imageMso=“FillRight“/>

  19.                  </group>

  20.             </tab>

  21.         </tabs>

  22.     </ribbon>

  23. </customUI>

复制代码
步骤3 保存并验证代码。
步骤4 单击“Generate Callbacks”按钮生成回调。
步骤5 复制回调代码并关闭该文件。
步骤6 在Excel中打开该工作簿,添加一个标准模块。(不要担心出现的错误消息)
步骤7 粘贴代码到该模块中,并补充代码。
Public grxIRibbonUI As IRibbonUI
Public glngCount1 As Long
Public glngCount2 As Long

Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    Set grxIRibbonUI = ribbon
End Sub

Sub rxshared_click(control As IRibbonControl)
    grxIRibbonUI.Invalidate
End Sub

Sub rxshared_getLabel(control As IRibbonControl, ByRef returnedVal)
    Select Case control.ID
        Case “rxbtn”
            returnedVal = “功能区无效: ” & glngCount1 & “次.”
            glngCount1 = glngCount1 + 1
        Case “rxbtn2″
            returnedVal = “功能区无效: ” & glngCount2 & “次.”
            glngCount2 = glngCount2 + 1
    End Select
End Sub
按照代码作用的顺序放置代码,然后保存工作簿,关闭工作簿,接着重新打开该工作簿。
注意,此时单击任一按钮,两个标签均更新,如下图1所示。因为单击按钮时代码使整个功能区无效,所以两个控件都无效,共享的getLabel过程为第一个按钮调用一次,又为第二个按钮所调用。
图1:使IRibbonUI对象无效导致其中的所有控件都被验证
3、使单个控件无效
仍然以上面的例子来介绍,现在仅使触发click事件的按钮无效。将共享的click事件和共享的getLabel事件修改如下:
Public grxIRibbonUI As IRibbonUI
Public glngCount1 As Long
Public glngCount2 As Long

Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    Set grxIRibbonUI = ribbon
End Sub

Sub rxshared_click(control As IRibbonControl)
    Select Case control.ID
        Case “rxbtn”
            glngCount1 = glngCount1 + 1
        Case “rxbtn2″
            glngCount2 = glngCount2 + 1
    End Select
    grxIRibbonUI.InvalidateControl (control.ID)
End Sub

Sub rxshared_getLabel(control As IRibbonControl, ByRef returnedVal)
    Select Case control.ID
        Case “rxbtn”
            returnedVal = “功能区无效: ” & glngCount1 & “次.”
            glngCount1 = glngCount1 + 1
        Case “rxbtn2″
            returnedVal = “功能区无效: ” & glngCount2 & “次.”
            glngCount2 = glngCount2 + 1
    End Select
End Sub
此时,只会使单击的控件无效并统计其数量,如下图2所示。

图2:仅使单个的控件对象无效
综上,本文主要介绍了自定义功能区的一个重要的内容,即通过回调添加功能。讲述了如何捕获和使用Ribbon对象以及如何通过单独的或共享的回调来组织过程。

TA的精华主题

TA的得分主题

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

转自: http://www.excelperfect.com/index.php/2009/08/27/ribbonxstudy16/
细品RibbonX(16):RibbonX开发基础问答

在前面的一系列关于RibbonX的介绍中,我们一起认识了Office 2007的功能区界面,了解了RibbonX开发的基础知识,介绍了一些有用的资源,并重点讲解了RibbonX开发的工具以及步骤,关键的XML知识和回调基础。下面,我们以问答的形式对前面的一些主要知识进行小结。
问题1 没有任何第三方工具,我如何创建自定义的选项卡?
如果有第三方工具辅助,例如Custom UI Editor,那么自定义功能区是很方便的。不过没有也不要紧,只是稍微复杂一点罢了。
步骤1 打开Excel,输入数据后,使用xlsm扩展名保存该文件。
确保使用xlsm扩展名保存Excel文件,否则Excel会去除包含宏的文件。
步骤2 关闭Excel,然后在Windows中打开保存该文件的文件夹。
步骤3 在该文件夹中创建一个名为customUI的新文件夹。
步骤4 在这个新文件夹中添加一个名为customUI.xml的新文本文件。记住,该文本文件的扩展名为xml。
在customUI.xml文件中添加自定义选项卡的XML代码:
  1. <?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes” ?>

  2. <customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui”>

  3.     <ribbon>

  4.         <tabs>

  5.             <tab id=”myTab” label=”我的选项卡” keytip=”MT”>

  6.             </tab>

  7.         </tabs>

  8.     </ribbon>

  9. </customUI>
复制代码

说明:上述代码中有一个keytip属性,代表用户按Alt键时选项卡出现的提示键,即用户按Alt+MT键就可以选择自定义的选项卡。在定义提示键时,选择的字符应避免与相同级别已有的提示键相冲突,例如,每个选项卡必须有唯一的提示键,然而其中的控件可以与选项卡有相同的提示键,只要它不与其它控件的提示键相同。
步骤5 将刚创建的Excel文件的扩展名改为ZIP。
步骤6 从ZIP文件中提取_rels文件夹,并修改其中的.rels文件,用于告诉Excel存在customUI.xml文件。在.rels文件中添加下面的代码:
<Relationship Id=”rId4″ Type=”http://schemas.microsoft.com/office/2006/relationships/ui/extensibility” Target=”customUI/customUI.xml” />
必须提供唯一的Id属性值。Type属性必须指向自定义用户界面扩展的架构,因此使用如代码中显示的URL。Target属性指向自定义文件的位置。
步骤7 将_rels文件夹放回到ZIP文件中。
步骤8 将customUI文件夹放到ZIP文件中。
步骤9 将ZIP文件的扩展名修改回Excel的扩展名。
此时,打开Excel文件后,将看到如下图1所示的自定义选项卡。该选项卡是空的,因为我们还没有在其中添加任何的组。注意,该选项卡显示了MT提示键。

图1:添加空白选项卡
问题2 如何在选项卡中添加组?
在上文中,我们已经创建了一个新的选项卡。那么,在该选项卡中添加组也是相当容易的,只需要修改customUI.xml文件。此时,首先应该设计好布局,然后再添加相应的VBA代码。
下面是修改后在customUI.xml文件中添加的xml代码:
  1.            <tab id=”myTab” label=”我的选项卡” keytip=”MT”>



  2.                 <group id=”Default” label=”默认组“>

  3.                 </group>



  4.                 <group id=”SeparatorGroup” label=”使用分隔条的组“>

  5.                     <separator id=”SeparatorItem” visible=”true” />

  6.                 </group>



  7.                 <group id=”DialogBoxLaunch” label=”使用对话框启动器的组“>

  8.                     <dialogBoxLauncher>

  9.                         <button id=”LaunchDialog”

  10.                                 screentip=”对话框启动器“

  11.                                 supertip=”单击此按钮通常会显示一个对话框.”

  12.                                 keytip=”LD” />

  13.                     </dialogBoxLauncher>

  14.                 </group>



  15.             </tab>
复制代码

上述代码在选项卡中添加了三个组。按上文所述步骤,将修改后的customUI.xml文件替换ZIP文件夹中原来的customUI.xml文件,然后将ZIP文件扩展名修改回xlsm扩展名,打开Excel文件,结果如下图2所示。

图2:添加了三个组的选项卡
下面我们对上述代码进行简单的说明。
上述代码以标准的组开始,没有包括任何特定的功能。通常,可以在<group>和</group>标签之间放置控件。组能够使用下列属性:
l         image(添加图像到组中)
l         imageMso(添加内置图像到组中)
l         keytip(为组提供加速键)
l         screentip(为使用组显示一条简短的提示)
l         supertip(为使用组显示一条较详细的提示)
然而,在通常情况下,我们不会使用这些额外的属性。事实上,由于组本身的特点,即使设置了这些属性,相应的特点可能也不会反映到界面中,因为Office忽略了这些属性。
除了在组中放置控件外,还有两个额外的子元素。<separator>元素在组中放置一条分隔条,提供控件之间的分隔,例如“视图”选项卡中的一些组,为我们提供了如何放置分隔条以提供更好的外观的示例。
一些组中还包括有对话框启动器,单击它将提供更多的功能。如上述代码所示,使用<dialogBoxLauncher>元素来提供对话框启动器。<dialogBoxLauncher>元素需要包括<button>控件,否则Office不会显示,并且<dialogBoxLauncher>元素必须包含一个且唯一一个<button>控件,不能使用任何其它的控件。
问题3 使用记事本定制Ribbon太麻烦且易出错,有没有第三方工具可以简化定制Ribbon的过程?
有。包括一款名为Office 2007 Custom UI Editor的工具和XML NotePad的工具,此外,还可以使用Visual Studio 2008来定制Ribbon。
问题4 Office 2007 Custom UI Editor是什么?
Office 2007 Custom UI Editor是一款小巧的用于自定义Office功能区的工具,使用该工具非常方便。不仅可以直接输入代码,还可以验证代码、添加图像,产生回调。但遗憾的是,不支持中文。
问题5 如何使用Office 2007 Custom UI Editor自定义功能区?
使用Office 2007 Custom UI Editor创建自定义功能区非常简单。仍以上述代码为例,简要地介绍其步骤:
步骤1 创建需要自定义功能区的Excel文件并保存。
步骤2 关闭Excel文件。
注意,在使用Custom UI Editor自定义功能区之前,必须首先关闭相应的Excel文件。
步骤3 打开Custom UI Editor。
步骤4 在Custom UI Editor中打开Excel文件。
步骤5 编写xml代码。

图3:在CustomUIEditor中输入代码
步骤6 保存并关闭Custom UI Editor
步骤7 打开Excel文件。此时,将出现自定义的功能区元素。
问题6 我要在Office 2007中开发中文的选项卡和组,如何进行?
可以采取使用记事本的方法,只不过在保存xml文件时,选择utf-8格式。
问题7 在哪里可以获取Office图标?
您可以从Microsoft的网站上搜索Office2007IconsGallery.EXE,下载该文件后安装。然后找到Office2007IconsGallery.xlsm文件并打开,此时在“开发工具”选项卡中将包含一个Office图标组,可以确定所有内置图标的名字。
您也可以从下列站点获得:
http://www.excelperfect.com/wordpress/2009/05/06/ribbonxstudy8/
问题8 如何获取控件的标识符
Microsoft提供了一种简单的方法很容易获得控件的标识符名。单击“Office按钮——选项”,调出应用程序选项对话框。在该对话框中,选择“自定义”选项卡。在“从下列位置选择命令”组合框中选择,然后将鼠标悬浮在下方列表框中的某个命名上,即可显示其标识符。然而,这仅对控件有用,如果需要知道选项卡和组的标识符,应在Microsoft的网站上下载专门的文档。
问题9 如何添加自定义功能?
在使用XML自定义功能区后,除了使用内置控件或者希望利用内置控件的功能外,还可以添加自定义功能。这需要使用回调,即使自定义的界面工作的VBA代码。
1)为含有组和控件的选项卡编写VBA代码
最常见的任务之一是创建带有组和控件的选项卡,以添加自定义的功能。下面介绍如何处理“My Tab”选项卡的“My Group”组中名为“My Button”的按钮。
步骤1 Custom UI Editor中编写XML
  1. <?xml version=“1.0“ encoding=“UTF-8“ standalone=“yes“?>

  2. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>

  3.   <ribbon>

  4.     <tabs>



  5.     <tab id=“myTab“ label=“My Tab“>

  6.       <group id=“myGroup“ label=“My Group“>

  7.         <button id=“myButton“

  8.                   label=“My Button“

  9.                   image=“Colorblk2“

  10.                   size=“large“

  11.                   onAction=“myButton_ClickHandler“/>

  12.       </group>

  13.       </tab>



  14.     </tabs>



  15.   </ribbon>

  16. </customUI>
复制代码

步骤2 插入图标
单击“Insert Icons”按钮,插入名为Colorblk2的图标。这里,使用的是自定义图像,因此使用image属性。
步骤3 生成回调代码
单击“Generate Callbacks”按钮,生成回调代码:
‘Callback for myButton onAction
Sub myButton_ClickHandler(control as IRibbonControl)
End Sub
复制该段代码,并关闭Custom UI Editor。
步骤4 编写VBA代码
打开工作簿,切换到VBE,插入一个新模块,并粘贴代码。然后,在其中编写要实现的功能的代码。最后的代码如下:
‘Callback for myButton onAction
Sub myButton_ClickHandler(control As IRibbonControl)
    MsgBox control.ID + “被单击.”
End Sub
此时,保存Excel文件,切换到“My Tab”选项卡,单击“My Button”按钮,会出现包含该按钮标识符信息的消息框,如图4所示。

图4:单击自定义的按钮后执行相应的VBA代码的结果

TA的精华主题

TA的得分主题

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

接 细品RibbonX(16):RibbonX开发基础问答


2)修改已有的选项卡、组和控件
只要知道相应的标识符,我们就能够修改已有的选项卡、组和控件。下面,首先在现有的选项卡中添加一个新组和控件,然后实现该控件的自定义操作。
在现有的选项卡中添加新组和控件的XML如下:
      <tab idMso=“TabHome“>
        <group id=“BehaviorChange“
               label=“Behavior“
               insertAfterMso=“GroupFont“>
          <toggleButton id=“StopUnderline“
                        label=“Stop Underlining“
                        onAction=“StopUnderline_ClickHandler“
                        getPressed=“StopUnderline_GetPressed“
                        size=“large“
                        imageMso=“ShapeFillColorPicker“
                        insertBeforeMso=“UnderlineGallery“/>
        </group>
      </tab>
从上述代码可知,新组出现在“开始”选项卡中,其名称为“Behavior”,并且将该组插入到“字体”组之后,该组中包含一个大尺寸的切换按钮。必须为该切换按钮提供两个回调:onAction和getPressed。在单击切换按钮时,onAction回调执行与标准按钮相同的任务,而getPressed回调记录切换按钮的状态。该切换按钮使用了Office提供的图标。
界面如下图5所示:

图5:在“开始”选项卡中添加新组和控件
(注意,在Custom UI Editor生成的回调中,不总是提供正确的参数,例如OnAction回调,其正确的参数为:
Sub OnAction(control as IRibbonControl,pressed as Boolean,ByRef fCancelDefault)
可以参考:
http://msdn2.microsoft.com/en-us/library/ms406047.aspx
下面的XML用于重利用“下划线”按钮:
  <commands>
    <command idMso=“Underline“
             onAction=“myUnderline“/>
  </commands>
接着,在Custom UI Editor中生成回调代码并复制到VBE中,添加代码如下:
‘Define a global variable to hold the Ribbon reference.
Dim Rib As IRibbonUI

‘Determines the behavior button state.
Dim lBehavior As Boolean

‘Callback for customUI.onLoad
Sub RibbonLoaded(ribbon As IRibbonUI)

    ‘Save the ribbon reference.
    Set Rib = ribbon

    ‘Initialize the behavior state.
    lBehavior = False

    ‘Tell the user the Ribbon is loaded.
    MsgBox “Ribbon Loaded”
End Sub

‘Callback for myUnderline onAction
Sub myUnderline(control As IRibbonControl, pressed As Boolean, ByRef fCancelDefault)
    If (lBehavior) Then
        MsgBox “No Underlined Allowed!”
        pressed = False
        fCancelDefault = True
    Else
        fCancelDefault = False
    End If
End Sub

‘Callback for StopUnderline onAction
Sub StopUnderline_ClickHandler(control As IRibbonControl, pressed As Boolean)

    ‘ Change the behavior state.
    lBehavior = pressed

    ‘ Update the control.
    Rib.InvalidateControl (control.ID)
End Sub

‘Callback for StopUnderline getPressed
Sub StopUnderline_GetPressed(control As IRibbonControl, ByRef returnedVal)

    ‘ Return the current behavior state.
    returnedVal = lBehavior
End Sub
上述代码在开始部分定义了一个变量来追踪应用程序的状态,以确保添加的控件反映正确的状态。StopUnderline_ClickHandler()过程接受当前的控件及其按下的状态,代码在lBehavior中存储该控件的状态,然后使用InvalidateControl()重绘。通过返回lBehavior到功能区,StopUnderline_GetPressed()过程执行显示当前切换按钮状态的处理。由于首次装载文档时功能区调用该过程,因此必须在RibbonLoaded()中提供lBehavior的默认值。本例中,当lBehavior为False时,myUnderline()执行默认的行为。当用户设置Stop Underlining按钮并且lBehavior为True时,代码显示一条消息告诉用户不允许添加下划线。
3)修改或重利用Office菜单
也可以修改或重利用Office菜单项。下面的XML在Office菜单中添加项目:
    <officeMenu>
      <menu idMso=“FilePrepareMenu“>
        <button id=“NewPrepButton“
                label=“My Prepare Button“
                description=“Prepare Time“
                image=“TIME“
                insertBeforeMso=“FileProperties“
                onAction=“NewPrepButton_ClickHandler“/>
      </menu>

      <splitButton idMso=“FileSaveAsMenu“>
        <menu idMso=“FileSaveAsMenu“>
          <button id=“SayHello“
                  label=“Say Hello“
                  description=“This button says hello!“
                  image=“Colorblk2“
                  onAction=“SayHello_ClickHandler“/>
        </menu>
      </splitButton>

    </officeMenu>
如上所示,Office菜单项出现在<officeMenu>元素中。本例中,代码在“准备”菜单里添加了一个名为“My Prepare Button”的新按钮,放置在菜单列表的顶部并使用了自定义图标。
应该注意到,“另存为”(FileSaveAsMenu)菜单以<splitButton>开始,因为它是一个拆分按钮。
接着,在Custom UI Editor中生成回调代码并复制到VBE中,添加代码如下:
‘ Callback for My Prepare Button on the
‘ Prepare menu of the Office menu.
Sub NewPrepButton_ClickHandler(control As IRibbonControl)

    ‘ Display a message.
    MsgBox “Are you prepared?”, vbYesNo
End Sub

‘ Provides support for the Say Hello Button on the
‘ Save As menu of the Office Menu.
Sub SayHello_ClickHandler(control As IRibbonControl)

    ‘ Display a message.
    MsgBox “Hello!”
End Sub
下面的XML用于重利用另存为“Excel 97-2003工作簿”命令:
  <commands>
    <command idMso=“FileSaveAsExcel97_2003“
             onAction=“FileSaveAs_ClickHandler“/>
  </commands>
下面是相应的VBA代码:
‘ Repurposes callback for the File Save As button.
Sub FileSaveAs_ClickHandler(control As IRibbonControl, ByRef fCancelDefault)

    ‘ Holds the user response.
    Dim Answer As VbMsgBoxResult

    ‘ Display a message.
    Answer = MsgBox(“Saving as an older version. Are you sure?”, vbYesNo)

    ‘ Act on the response.
    If Answer = vbYes Then
        fCancelDefault = False
    Else
        fCancelDefault = True
    End If
End Sub
注意参数fCancelDefault的使用。代码开始显示一条消息框,如果用户单击“是”,那么代码将fCancelDefault设置为False,表示显示“另存为”对话框;否则,代码将fCancelDefault设置为True,表示不做任何操作。
上述所有代码中,最重要的回调之一是功能区装载,即在<customUI>元素中使用onLoad属性:
<customUI onLoad=“RibbonLoaded“
          xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
在工作簿打开时,将产生onLoad回调,查找VBA代码中的RibbonLoaded过程。该过程的代码如下:
‘Define a global variable to hold the Ribbon reference.
Dim Rib As IRibbonUI

‘Callback for customUI.onLoad
Sub RibbonLoaded(ribbon As IRibbonUI)

    ‘Save the ribbon reference.
    Set Rib = ribbon

    ‘Initialize the behavior state.
    lBehavior = False

    ‘Tell the user the Ribbon is loaded.
    MsgBox “Ribbon Loaded”
End Sub
使用Invalidate方法告诉功能区进行重绘,显示移除、修改或添加的特征。
问题10 可以从头开始设计功能区吗?
可以。Microsoft提供了一个名为startFromScratch的属性,将其值设置为true,将移除现有的功能区界面。从头开始设计功能区可以限制用户访问您不希望其使用的功能。
只需在<ribbon>元素中添加startFromScratch属性并设置其值为true,即可从头开始设置功能区:
<ribbon startFromScratch=”true”>
问题11 可以从功能区中调用自定义的用户窗体吗?
可以,其实这也是取代自定义复杂的功能区的一种方式,您可以在用户窗体中实现一系列RibbonX控件的操作。而您只需要在功能区中添加一个按钮,用来调用用户窗体。
下面介绍一个显示和使用简单用户窗体的示例。
首先,在功能区中添加一个用于访问用户窗体的按钮。其XML代码如下:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon>
    <tabs>
      <tab idMso=“TabHome“>
        <group id=“FormList“ label=“Forms“>
          <button id=“ShowForm“
                  label=“Show Form“
                  imageMso=“HappyFace“
                  size=“large“
                  onAction=“ShowMyForm“ />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
在工作簿中添加回调代码:
‘ Callback for ShowMyForm onAction
Sub ShowMyForm(control As IRibbonControl)
    ‘ Call the common processing routine.
    ProcessForm
End Sub
其中,ProcessForm是一个过程的名称,该过程用于处理用户窗体的操作。

TA的精华主题

TA的得分主题

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

转自: http://www.excelperfect.com/index.php/2009/08/31/ribbonxstudy17/
细品RibbonX(17):RibbonX控件概述
在Office 2007中,可以使用比以前版本更多的控件,并且在大多数情况下也能改变控件尺寸。各种各样的控件选项意味着可以通过从RibbonX工具箱中选择正确的控件并正确地设置它们来创建更好的界面。下面,让我们先概要了解一下RibbonX控件。
RibbonX控件概览
在Office 2007中,控件不仅仅有特定的作用,而且有大小和上下文内容。例如,在大多数编程环境中按钮都是标准形式的按钮,然而在RibbonX中,可以创建大尺寸或者标准尺寸的按钮。此外,按钮的使用(以及在某些情况下的外观)随上下文而不同:
l         功能区中的标准按钮
l         对话框启动器的一部分
l         下拉列表的一部分
l         在快速访问工具栏中(QAT)
l         拆分按钮的一部分
l         带有标题的拆分按钮的一部分
l         在控件组内
l         菜单的一部分
上下文使得在如何使用控件方面有非常大的不同。例如,在对话框启动器里面必须包括一个按钮。Office限制下拉列表中按钮的数量是16,但不必包括任何任何内容。在拆分按钮里包括的按钮总是可见的,如果试图使用visible属性,Office就会激发错误。
下表提供了RibbonX控件列表及其简要的介绍。
控件名称
  
框(box)
将控件组合在一个组里。可以在框里放置任何控件,将控件按水平或垂直流向设置。必须提供boxStyle属性:vertical或horizontal。与按钮组控件不同,除了设置控件流向外,框控件不会提供可视化外观。
按钮(button)
提供基本的执行功能。单击按钮,会发生某项操作。上文已提及,Office在多种上下文内容中使用按钮控件。
按钮组(buttonGroup)
将不同类型的按钮组合在一起。按钮出现在自然的框里面,并且Office将它们放置在一起来表明其以某种方式联系。可以使用其组合下列控件:按钮、切换按钮、库、菜单、动态菜单和拆分按钮控件。
复选框(checkBox)
提供基本的选择功能。通过单击该控件,用户启用或禁用某选项。Office为复选框控件提供了两种上下文环境,包括作为单独的控件或者是菜单的一部分。
组合框(comboBox)
为用户显示一列选项,使用item控件创建选项列表。每个comboBox控件必须包括至少一个item控件作为子项。当使用comboBox控件时,用户也能够输入一个不在列表中出现的值(dropDown控件需要用户选择列表中的某个项目)。
下拉控件(dropDown)
为用户为示一列选项,使用item或button控件创建选项列表。列表至少应包含两类可选的控件之一。用户必须选择提供的列表中的某选项。当用户选择button而不是item时,Office执行所需求的动作,而不是选择期望的选项。
动态菜单(dynamicMenu)
定义在运行时而不是设计时所创建的菜单。菜单内容能够修改以满足特定的需要。必须包括getContent回调来使用该控件。dynamicMenu控件能够作为buttonGroup、menu或splitButton控件的一部分出现。
编辑框(editBox)
让用户输入纯文本到功能区中。可以使用这项功能执行某任务,例如搜索。使用这个控件来进行任何不能通过使用其它控件来定义的输入。
库(gallery)
在下拉结构中显示一组控件以节省功能区空间。Word在“开始”选项卡的“样式”组中使用这样的组。gallery控件不同于其它的组合控件,它提供了可以以不同方式控制的下拉列表。可以使用rows和columns属性修改控件的外观。itemWidth和itemHeight属性用来控制组中每项的大小。在buttonGroup或menu控件里使用Gallery控件,或者作为独立的控件。要在库中显示项目,则需在getItemCount、getItemImage和getItemLabel回调中添加代码。
标签控件(labelControl)
在屏幕中创建标签。可以在标签控件组或者不易使其以其它形式识别的元素中使用该控件。用户不能够与提供的标签相交互。
菜单(menu)
定义在设计时创建的菜单。菜单可以包含诸如button和checkBox控件之类的控件。可以单独使用菜单,也可以作为splitButton控件的一部分。使用menuSeparator控件在菜单元素之间放置分隔条。与gallery控件不同,menu控件在单列呈现所有的选项(更像老版本Office的菜单系统)。
菜单分隔条(menuSeparator)
在任何控件组里提供分隔元素。
拆分按钮(splitButton)
创建具有默认操作和一列选择性选项的按钮。拆分按钮最好的示例之一是“开始”选项卡的“剪贴板”组中的“粘贴”按钮。必须包括button或toggleButton控件为默认控件。在menu控件里出现可选的操作,这里可以添加button或toggleButton控件。
切换按钮(toggleButton)
提供checkBox和button控件的组合。用户通过单击toggleButton选择某状态和执行某操作。
通用的RibbonX控件属性
RibbonX提供了许多通用的属性,可以用来控制应用程序的外观。下表简要介绍了大多数通用的属性。
属性
  
description
当菜单的itemSize属性设置为大时指定Office显示的描述文本。
enabled
确定Office是否启用或禁用控件。可以选择true或false作为其值。
id
为自定义控件指定标识符。不能与idMso或idQ属性一起使用。
idMso
为内置控件指定标识符。不能与id或idQ属性一起使用。
idQ
为限定的控件指定标识符(限定的控件取决于定义的自定义命名空间)。不能与id或idMso属性一起使用。
image
定义控件使用的自定义图像的名称。
imageMso
定义控件使用的内置图像的名称。
insertAfterMso
基于内置控件的位置,标识新控件的位置。
insertAfterQ
基于限定的控件的位置,标识新控件的位置。
insertBeforeMso
基于内置控件的位置,标识新控件的位置。
insertBeforeQ
基于限定的控件的位置,标识新控件的位置。
itemSize
确定菜单或其它控件项的大小。可以选择large和normal。
keyTip
对控件添加指定的加速键组合。当用户按下Alt键时显示键提示。可以指定任意键组合,使用1至3个字母。
label
指定控件显示的文本。
screenTip
提供简要的提示,帮助用户理解控件的用途。
showImage
确定Office是否显示与控件项相关的图像。可以选择true或false。
showItemImage
确定Office是否显示与菜单或其它控件项相关的图像。可以选择true或false。
showItemLabel
确定Office是否显示与菜单或其它控件项相前的标签。可以选择true或false。
showLabel
确定Office是否显示与控件相关的标签。可以选择true或false。
size
确定控件的大小。可以选择large或normal。
sizeString
设置控件的大小来包含指定宽度的字符串。
superTip
提供详细的提示,帮助用户理解控件的用途。
tag
包含用户定义的数据,可以在应用程序中用来与控件或其它元素交互。
title
为menuSeparator控件指定显示的文本代替水平线。
visible
确定Office是否显示某控件或其它功能。可以选择true或false。



TA的精华主题

TA的得分主题

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

接 细品RibbonX(17):RibbonX控件概述



通用的RibbonX控件回调
RibbonX提供了许多通用的回调,可用于监控应用程序。下表介绍了创建应用程序时常用的回调。
回调
相关的控件
描述
getContent
dynamicMenu
定义控件的内容。
getDescription
多个控件
获取控件的描述。
getEnabled
多个控件
让代码启用或禁用控件。
getImage
多个控件
获取为控件提供的自定义图像。
getImageMso
多个控件
获取为控件定义的标准图像。
getItemCount
comboBox,DropDown,gallery
获取控件的项目列表中的项目数。
getItemHeight
gallery
以像素为单位确定项目显示在屏幕中的高度。
getItemID
comboBox,dropDown,gallery
确定当前项目的ID。
getItemImage
comboBox,dropDown,gallery
获取与当前项目相关的图像。
getItemLabel
comboBox,dropDown,gallery
获取与当前项目相关的标签。
getItemScreenTip
comboBox,dropDown,gallery
获取与当前项目相关的屏幕提示。
getItemSuperTip
comboBox,dropDown,gallery
获取与当前项目相关的超级提示。
getItemWidth
gallery
以像素为单位确定项目显示在屏幕中的宽度。
getKeytip
多个控件
获取控件的键提示(加速键)。
getLabel
多个控件
获取控件的标签。
getPressed
checkBox,toggleButton
确定用户是否以手动的方式单击了控件以激活该控件。
getScreentip
多个控件
获取控件的屏幕提示。
getSelectedItemIndex
dropDown,gallery
确定用户从列表中选取的项目。
getSelectItemID
gallery
获取用户已经在列表中选取的项目的ID。
getShowImage
button
确定控件是否显示图像(允许禁止图像,即便已经为控件定义了图像)。
getShowLabel
button
确定控件是否显示标签(允许禁止标签,即便已经为控件定义了标签)。
getSize
多个控件
基于应用程序的输出,定义控件的大小。
getSupertip
多个控件
获取控件的超级工具提示。
getText
comboxBox,editBox
获取与列表中当前所选择的项目相关的文本。
getTitle
menuSeparator
为指定的控件提供标题。Office显示文本来代替通常显示的水平线。
getVisible
button
确定是否控件可见。
LoadImage
customUI
作为整体装载与用户界面相关的图像。
onAction
多个控件
执行控件在应用程序代码中定义的操作。
onChange
comboBox,editBox
在用户选择或控件内容中发现变化。
onLoad
customUI
在装载过程中执行指定的操作。


TA的精华主题

TA的得分主题

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

转自: http://www.excelperfect.com/index.php/2009/08/31/ribbonxstudy18/
细品RibbonX(18):button控件详解

在功能区的按钮中,可以使用内置图像或提供自已的图像,可以指定大按钮或者更小的形式,添加少量的代码甚至可以同时提供标签。此外,可以利用大量的回调过程从而使按钮为动态的。按钮提供了几种用于定制外观和响应的属性。某些属性是必需的,另外一些是可选的。
在创建按钮时,下面所列出的表可以提供良好的参考。
1button元素必需的属性
按钮需要下表1所列的id属性之一。
表1:button元素必需的属性
属性

何时使用

id

当创建自已的按钮时

idMso

当使用现有的Microsoft按钮时

idQ

当在命名空间之间创建共享的按钮时

每个按钮也需要表2所列出的onAction回调。
表2:button元素必需的回调
动态属性

允许值

VBA回调签名

onAction

1至4096个字符

Sub OnAction(control As IRibbonControl)

onAction

重新使用(或重利用)

Sub OnAction(control As IRibbonControl,
byRef CancelDefaultcancelDefault)

2、带有回调签名的可选的静态属性和动态属性
使用按钮时,可以使用下表3列出的任一insert属性。
表3:button元素可选的insert属性
INSERT属性

允许值

默认值

何时使用

insertAfterMso

有效的Mso组

在组末尾插入

在Microsoft控件之后插入

insertBeforeMso

有效的Mso组

在组末尾插入

在Microsoft控件之前插入

insertAfterQ

有效的组idQ

在组末尾插入

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

insertBeforeQ

有效的组idQ

在组末尾插入

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

也可以提供下表4所列的任何或所有的属性。
表4:button元素可选的属性和回调
静态属性

动态属性

允许值

默认值

动态属性的VBA回调签名

description

getDescription

1至4096个字符

(none)

Sub GetDescription(control  As IRibbonControl,ByRef returnedVal)

enabled

getEnabled

true,false,1,0

true

Sub GetEnabled(control As                                              IRibbonControl,ByRef returnedVal)

image

getImage

1至1024个字符

(none)

Sub GetImage(control As                                              IRibbonControl,ByRef returnedVal)

imageMso

getImage

1至1024个字符

(none)

同上

keytip

getKeytip

1至3个字符

(none)

Sub GetKeytip(control As                                             IRibbonControl,ByRef returnedVal)

label

getLabel

1至1024个字符

(none)

Sub GetLabel(control As
IRibbonControl,ByRef returnedVal)

screentip

getScreentip

1至1024个字符

(none)

Sub GetScreentip(control As IRibbonControl,ByRef returnedVal)

showImage

getShowImage

true,false,1,0

true

Sub GetShowImage(control As IRibbonControl,ByRef returnedVal)

showLabel

getShowLabel

true,false,1,0

true

Sub GetShowLabel(control As IRibbonControl,ByRef returnedVal)

size

getSize

normal,large

normal

Sub GetSize(control As IRibbonControl,ByRef returnedVal)

supertip

getSupertip

1至1024个字符

(none)

Sub GetSupertip(control As IRibbonControl,ByRef returnedVal)

tag

(none)

1至1024个字符

(none)

(none)

visible

getVisible

true,false,1,0

true

Sub GetVisible(control As IRibbonControl,ByRef returnedVal)

3button元素允许的子对象
button控件不支持任何子对象。
4button元素的父对象
在下列任何控件内都能放置button控件:
n         box
n         buttonGroup
n         dialogBoxLauncher
n         documentControls
n         dynamicMenu
n         gallery
n         group
n         menu
n         splitButton
n         officeMenu
5、使用内置的按钮控件
(1)创建一个新的.xlsx文件,并将其保存为Excel Built In Button Example.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)应用RibbonBase模板。
(4)在<tabs>和</tabs>之间插入下列XML:
<tab id=“rxtabCustom1“
                 label=“Demo“
                 insertBeforeMso=“TabHome“>
                <group id=“DemoGroup“
                  label=“Demo Group“>
                   <button idMso=“AccountingFormat“/>
                </group>
            </tab>
下图为上述代码创建的组。
注意,当使用内置控件时,获得完整的包装:图像、标签、预设的回调,等等。因此,如果仅希望有图像和功能,则除了期望的idMso,需要设置showLabel属性为false。此时,简单地修改代码如下:
<tab id=“rxtabCustom1“
                 label=“Demo“
                 insertBeforeMso=“TabHome“>
                <group id=“DemoGroup“
                  label=“Demo Group“>
                   <button idMso=“AccountingFormat“
                       showLabel=“false“/>
                </group>
            </tab>
现在将创建仅显示图像的一个漂亮按钮,没有标签,如下图所示,当然它仍具有该内置控件的所有其他属性。
6、按钮的特性:showLabel属性
假设您希望上文中的按钮尺寸更大一些,则可以修改相应的代码如下:
                   <button idMso=“AccountingFormat“
                       showLabel=“false“
size=“large“/>
结果如下图所示:
代码中没有让标签显示,结果却出现了标签?这是按钮模型的一个奇怪的特性。在size=”normal”情况下正常工作的按钮,在size=”large”时却不按要求工作。如上所见,当按钮是大尺寸时,默认值覆盖了自定义的设置。
如何达到要求呢?要想在大尺寸时不显示标签,需要将标签文本指定为空格(必须要有一个空格)。如下所示:
               <group id=“DemoGroup“
                  label=“Demo Group“>
                   <button idMso=“AccountingFormat“
                       label=“ “
                       size=“large“/>
                </group>
结果如下图:




TA的精华主题

TA的得分主题

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

接 细品RibbonX(18):button控件详解

7、创建自定义按钮控件
即添加自已的按钮,单击该按钮时,会触发自已编写的宏代码实现自定义的功能。
本例中,假设你是一名会计师,并且已经为支付的费用创建了一份连续的清单,如下图所示,
现在需要编写宏代码以每月为基础来准备下月的工作表,特别是要完成下述操作:
(1)复制Ending Balance到Openning Balance列。
(2)清除Additions和Usage区(本月的条目)。
(3)预先填写到下月结束的日期。
(4)指导用户保存文件。
因此,在标准模块中编写下列代码:
Public Sub RollForward()
    With ActiveSheet
        .Range(“E6:E10″).Copy
        .Range(“B6:B10″).PasteSpecial Paste:=xlValues
        .Range(“C6:D10″).ClearContents
        .Range(“A3″) = .Range(“A3″).Value + 40 – DatePart(“d”, .Range(“A3″).Value + 40)
   End With
   MsgBox “Rolled forward successfully!” & vbCrLf & _
       “Please save the file under a new name.”, _
       vbOKOnly + vbInformation, “Success!”
End Sub
可以按Alt+F8键,在“宏”对话框中选择RollForward来测试。
下面,我们将该宏附加到按钮中。首先,保存Excel文件并关闭。然后,在CustomUI Editor中打开该文件,输入下面的XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab id=“DemoTab“
                 label=“Demo“
                 insertBeforeMso=“TabHome“>
                <group id=“DemoGroup“
                       label=“Demo Group“>
                    <button id=“rxbtnRollForward“
                            label=“Roll Forward“
                            imageMso=“CreateReportFromWizard“
                            size=“large“
                            onAction=“rxbtnRollForward_Click“/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
单击“Generate Callbacks”生成回调,并复制生成的代码。保存并关闭CustomUI Editor,然后重新打开Excel。在VBE中粘贴从CustomUI Editor中复制的代码,然后添加代码来调用上面已经测试过的VBA过程。代码如下所示:
‘Callback for rxbtnRollForward onAction
Sub rxbtnRollForward_Click(control As IRibbonControl)
    Select Case control.ID
        Case Is = “rxbtnRollForward”
            Call RollForward
        Case Else
            ‘do nothing
        End Select
End Sub
保存后,回到Excel界面,再测试按钮。

TA的精华主题

TA的得分主题

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

转自: http://www.excelperfect.com/index.php/2009/09/28/ribbonxstudy19/
细品RibbonX(19):checkBox控件详解



checkBox控件能够使用户在两种状态之间切换。虽然默认情况下状态是真和假,但是该元素能够指明开/关、上/下、左/右、1/0、或者任何可以想象到的相对状态组合。
您可能想使用checkBox来做下列操作:
&sup2;        表明数据库中的某字段是否满足特定的条件。在这种情况下,当满足条件时,将自动选中复选框。
&sup2;        允许用户确定是否显示某对象,例如显示或隐藏网格线,或者子窗体。
1checkBox元素必需的属性
复选框控件需要下表1所列的id属性之一。
表1:checkBox元素必需的属性
属性何时使用
id当创建自已的复选框时
idMso当使用现有的Microsoft复选框时
idQ当在命名空间之间创建共享的复选框时
每个复选框控件也需要表2所列出的onAction回调。
表2:checkBox元素必需的回调
动态属性允许值VBA回调签名
onAction1至4096个字符Sub OnAction(control As IRibbonControl,pressed as Boolean)
2、带有回调签名的可选的静态属性和动态属性
复选框控件可以使用下表3列出的任一insert属性。
表3:checkBox元素可选的insert属性
INSERT属性允许值默认值何时使用
insertAfterMso有效的Mso组在组末尾插入在Microsoft控件之后插入
insertBeforeMso有效的Mso组在组末尾插入在Microsoft控件之前插入
insertAfterQ有效的组idQ在组末尾插入在共享的命名空间控件之后插入
insertBeforeQ有效的组idQ在组末尾插入在共享的命名空间控件之前插入
也可以提供下表4所列的任何或所有的属性。
表4:checkBox元素可选的属性和回调
静态属性动态属性允许值默认值动态属性的VBA回调签名
descriptiongetDescription1至4096个字符(none)Sub GetDescription(control  As IRibbonControl,ByRef returnedVal)
enabledgetEnabledtrue,false,1,0trueSub GetEnabled(control As IRibbonControl,ByRef returnedVal)
keytipgetKeytip1至3个字符(none)Sub GetKeytip(control As                                             IRibbonControl,ByRef returnedVal)
labelgetLabel1至1024个字符(none)Sub GetLabel(control As                                              IRibbonControl,ByRef returnedVal)
(none)getPressedtrue,false,1,0falseSub GetPressed(control As IRibbonControl,ByRef returnedVal)
screentipgetScreentip1至1024个字符(none)Sub GetScreentip(control As IRibbonControl,ByRef returnedVal)
supertipgetSupertip1至1024个字符(none)Sub GetSupertip(control As IRibbonControl,ByRef returnedVal)
tag(none)1至1024个字符(none)(none)
visiblegetVisibletrue,false,1,0trueSub GetVisible(control As IRibbonControl,ByRef returnedVal)
3checkBox元素允许的子对象
checkBox控件不支持任何子对象。
4checkBox元素的父对象
在下列任何控件内都能放置checkBox控件:
&Oslash;         box
&Oslash;         dynamicMenu
&Oslash;         group
&Oslash;         menu
&Oslash;         officeMenu
5、使用内置的复选框控件
(1)创建一个新的.xlsx文件,并将其保存为Excel Built In CheckBox 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“
                 insertBeforeMso=“TabHome“>
                <group id=“rxgrpDemo“
                       label=“Demo Group“>
                    <checkBox idMso=“GridlinesExcel“/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
下图为上述代码创建的组:

您也可以修改该控件的名字,使用下面的XML代替相应的语句:
                    <checkBox idMso=“GridlinesExcel“
                       label=“Toggle Gridlines“/>
此时,显示的界面如下图所示:

TA的精华主题

TA的得分主题

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

接 细品RibbonX(19):checkBox控件详解



6、创建自定义复选框控件
使用Excel时,便利的事情之一是迅速在工作簿中切换A1和R1C1样式公式的能力。在一些情形下,使用R1C1引用的公式将更好。下面的示例演示如何容易地快速切换两种引用形式的公式。
本示例在“公式”选项卡中添加一个控件,省去了必须通过Office菜单来找到该设置的复选框的麻烦。如下图所示,添加的新复选框控件在最右侧的“Other Settings”组中。
首先,新建一个工作簿,保存后关闭。然后使用CustomUI Editor输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“ onLoad=“rxIRibbonUI_onLoad“>
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab idMso=“TabFormulas“>
              <group id=“rxgrpOtherSettings“
                     label=“Other Setting“
                     insertBeforeMso=“GroupNamedCells“>
                  <checkBox id=“rxchkR1C1“
                       label=“R1C1 Formulas“
                       getPressed=“rxchkR1C1_getPressed“
                       onAction=“rxchkR1C1_click“/>
              </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
注意,在XML代码的第一行,添加了onLoad属性,以便后面使用时捕获Ribbon对象。
单击“Generate Callbacks”按钮,复制生成的代码。关闭CustomUI Editor。重新打开Excel文件,并打开VBE,将复制的代码粘贴到标准模块中。
现在,该文件中有三个回调签名:rxIRibbonUI_onLoad,rxchkR1C1_getPressed,rxchkR1C1_click,其目的是:
&Oslash;         rxIRibbonUI_onLoad存储RibbonUI对象,能够使控件无效以便随后强制更新控件。
&Oslash;         当第一次激活“公式”选项卡(或使无效)并适当地设置复选框时触发rxchkR1C1_getPressed。
&Oslash;         无论何时选中或取消选中复选框都将触发rxchkR1C1_click,其目的实际上是切换开关设置。
此外,rxIRibbonUI_onLoad需要自定义工作簿属性来操作,因此应该首先对其设置。在该工程的ThisWorkbook模块中,输入下列代码:
‘保存功能区和功能区控件状态的私有变量
Private pRibbonUI As IRibbonUI
Public Property Let RibbonUI(iRib As IRibbonUI)
    ‘设置RibbonUI属性以便后面使用
    Set pRibbonUI = iRib
End Property

Public Property Get RibbonUI() As IRibbonUI
    ‘获取RibbonUI属性以供使用
    Set RibbonUI = pRibbonUI
End Property
转到标准模块中,添加下列代码:
‘customUI.onLoad回调
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    ‘设置RibbonUI为工作簿属性以供后面使用
    ThisWorkbook.RibbonUI = ribbon
End Sub
此时,当装载该工作簿时,将捕获RibbonUI对象,并将可用于使之无效。
接下来,生成切换设置的宏。最容易的方法是先录制实现该功能的宏:打开宏录制器,选择“Office菜单—Excel选项—公式”,选中“R1C1引用样式”前的复选框。停止录制,转到VBE中查看录制的代码:
    Application.ReferenceStyle = xlR1C1
这就是宏录制器能够帮助编写代码的一种情形,告诉确切地告诉你需要引用的对象。虽然仍需要对代码作一些修改,但至少知道从哪里开始以及正确的语法。
再在处理getPressed回调。主要是确定应用程序是否是R1C1模式,如果是则返回true。代码如下:
‘rxchkR1C1 getPressed回调
Sub rxchkR1C1_getPressed(control As IRibbonControl, ByRef returnedVal)
    If Application.ReferenceStyle = xlR1C1 Then returnedVal = True
End Sub
下一步,处理单击复选框的回调。pressed参数告诉是否复选框被选中(pressed=true)或没有选中(pressed=false)。代码如下:
‘rxchkR1C1 onAction回调
Sub rxchkR1C1_click(control As IRibbonControl, pressed As Boolean)
    Select Case pressed
        Case True
            Application.ReferenceStyle = xlR1C1
        Case False
            Application.ReferenceStyle = xlA1
    End Select
End Sub
如果单击“公式”选项卡,将触发getPressed程序,设置复选框来表明当前所处的显示模式。否则,选择复选框来设置其为相反的状态。
但仍存在问题。假设有人通过“Excel选项”修改了复选框的值,此时选项卡中的复选框将不会被更新。
为解决这个问题,可以在无论何时激活新工作表时,强制更新该复选框。此时,使用使特定的控件(即rxchkR1C1 checkBox)无效的能力。
再转到ThisWorkbook代码模块,从代码窗口左侧下拉列表中选择Workbook,然后从右侧下拉列表中选择Sheet_Activate,添加代码如下:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    ‘每次激活一个工作表时使该选项卡无效
    ThisWorkbook.RibbonUI.InvalidateControl (“rxchkR1C1″)
End Sub
好了!保存并关闭后重新打开工作簿,然后输入公式来测试。
当然,在通过“Excel选项”设置R1C1引用样式后不会立即更新,您需要激活另一工作表后再返回该工作表,即可更新了。

TA的精华主题

TA的得分主题

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

转自: http://www.excelperfect.com/index.php/2009/09/29/ribbonxstudy20/
细品RibbonX(20):editBox控件详解




editBox控件允许用户输入文本,这为我们提供了一种允许用户输入的方便的方法。例如,可以使用editBox重命名Excel工作表。基本的概念是要求用户在editBox中输入,然后当其失去焦点且下一个控件激活之前发生事件。当然,也可以提供一个按钮,当单击该按钮后处理eidtBox控件中的内容。
1editBox元素必需的属性
编辑框控件需要下表1所列的id属性之一。
表1:editBox元素必需的属性
属性

何时使用

id

当创建自已的编辑框时

idMso

当使用现有的Microsoft编辑框时

idQ

当在命名空间之间创建共享的编辑框时

编辑框控件也需要表2所列出的onAction回调。
表2:editBox元素必需的回调
动态属性

允许值

VBA回调签名

onChange

1至4096个字符

Sub OnChange(control As IRibbonControl,
text as String)

2、带有回调签名的可选的静态属性和动态属性
编辑框控件可以使用下表3列出的任一insert属性。
表3:editBox元素可选的insert属性
INSERT属性

允许值

默认值

何时使用

insertAfterMso

有效的Mso组

在组末尾插入

在Microsoft控件之后插入

insertBeforeMso

有效的Mso组

在组末尾插入

在Microsoft控件之前插入

insertAfterQ

有效的组idQ

在组末尾插入

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

insertBeforeQ

有效的组idQ

在组末尾插入

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

也可以提供下表4所列的任何或所有的属性。
表4:editBox元素可选的属性和回调
静态属性

动态属性

允许值

默认值

动态属性的VBA回调签名

enabled

getEnabled

true,false,1,0

true

Sub GetEnabled(control As                                              IRibbonControl,
ByRef returnedVal)

image

getImage

1至1024个字符

(none)

Sub GetImage(control As IRibbonControl,
ByRef returnedVal)

imageMso

getImage

1至1024个字符

(none)

同上

keytip

getKeytip

1至3个字符

(none)

Sub GetKeytip(control As                                             IRibbonControl,
ByRef returnedVal)

label

getLabel

1至1024个字符

(none)

Sub GetLabel(control As
IRibbonControl,
ByRef returnedVal)

maxLength

(none)

1至1024个字符

1024

(none)

screentip

getScreentip

1至1024个字符

(none)

Sub GetScreentip(control As IRibbonControl,
ByRef returnedVal)

showImage

getShowImage

true,false,1,0

true

Sub GetShowImage(control As IRibbonControl,
ByRef returnedVal)

showLabel

getShowLabel

true,false,1,0

true

Sub GetShowLabel(control As IRibbonControl,
ByRef returenedVal)

sizeString

(none)

1至1024个字符

默认值为12

(none)

supertip

getSupertip

1至1024个字符

(none)

Sub GetSupertip(control As IRibbonControl,
ByRef returnedVal)

tag

(none)

1至1024个字符

(none)

(none)

(none)

getText

1至4096个字符

(none)

Sub GetText(control As IRibbonControl,
ByRef returnedVal)

visible

getVisible

true,false,1,0

true

Sub GetVisible(control As IRibbonControl,
ByRef returnedVal)

3editBox元素允许的子对象
editBox控件不支持任何子对象。
4editBox元素的父对象
仅能够在下列两个控件内放置editBox控件:
&Oslash;         box
&Oslash;         group
5、使用内置的编辑框控件
很有趣,没有方法自定义任何内置的editBox控件。
6、创建自定义编辑框控件
如前所述,编辑框为获取用户输入提供了一种有效的方式。下面的示例介绍一些常见的使用,例如修改文件或工作表的名字。
创建一个新的Excel工作簿并以.xlsm格式保存。打开VBE,插入一个标准模块,在其中创建到将来要对编辑框进行操作的宏代码。代码如下:
Private Function shtRename(sCallSheet As String) As Boolean
    On Error Resume Next
    ActiveSheet.Name = sCallSheet
    If Err.Number = 0 Then shtRename = True
End Function

Public Sub RenameSheet()
    Dim sNewSheetName As String
    sNewSheetName = InputBox(“请为工作表输入一个新名字.”)
    If shtRename(sNewSheetName) = False Then
        MsgBox “发生问题了,不能够” & vbCrLf & _
            “重命名工作表.请再试.”, _
            vbOKOnly + vbCritical, “错误!”
    End If
End Sub
下面简要解释上述两个过程。shtRename是一个用于重命名工作表的自定义函数。On Error语句在遇到错误时允许程序继续执行。该函数通过测试是否遇到错误,并返回真/假值表明是否重命名成功。
RenameSheet调用shtRename函数并测试是否成功,如果没有成功则通知用户。
要测试代码,运行RenameSheet过程,出现提示时输入名字,此时工作表将被重命名。如果提供了一个无效的参数,例如已存在的工作表字,那么将会返回错误消息。
现在,关闭Excel工作簿,再CustomUI Editor中打开该工作簿,输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab id=“rxtabCustom“
                 label=“My Tools“
                 insertBeforeMso=“TabHome“>
                 <group id=“rxgrpCustom“
                        label=“Worksheet“>
                        <editBox id=“rxtxtRename“
                                 label=“Rename Sheet to:“
                                 imageMso=“SignatureLineInsert“
                                 keytip=“R“
                                 sizeString=“123456789012345“
                                 onChange=“rxtxtRename_Click“/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
技巧:在使用sizeString属性时,使用增加的数字输入字符数便于迅速判断允许的字符数。本例中,“123456789012345”是15个字符。
接下来,生成回调签名并复制代码,保存后关闭CustomUI Editor。
在Excel中重新打开工作簿,在界面中应该看到一个带有编辑框的自定义选项卡,如下图所示。

由于没有实现操作的回调代码,因此该编辑框不做任何操作。打开VBE,在标准模块中粘贴回调签名,并输入下列代码:
‘rxtxtRename onChange回调
Sub rxtxtRename_Click(control As IRibbonControl, text As String)
    If shtRename(text) = False Then
        MsgBox “发生问题了,不能够” & vbCrLf & _
            “重命名工作表.请再试.”, _
            vbOKOnly + vbCritical, “错误!”
    End If
End Sub
好了!现在可以测试编辑框了。回到Excel界面,在自定义的编辑框中输入新的名字,查看工作表标签是否已被更新。
下面,再演示一个例子:在编辑框中输入数字后,当前单元格所在的列宽将作相应的调整。在CustomUI Editor中打开上例所示的工作簿,在其中添加下面的XML代码:
                <group id=“rxgrpCustom1“
                       label=“Change Column Width“>
                       <editBox id=“rxtxtWidth“
                                label=“Width:“
                                sizeString=“1234567890“
                                onChange=“rxtxtWidth_Change“/>
                </group>
生成回调签名并复制后,关闭CustomUI Editor。在Excel中打开该工作簿,在VBE中粘贴回调签名,并输入代码:
Dim dblWidth As Double
‘rxtxtWidth onChange回调
Sub rxtxtWidth_Change(control As IRibbonControl, text As String)
    On Error Resume Next
    dblWidth = CDbl(text)
    If Err.Number <> 0 Then
        MsgBox “对不起,必须输入数字值!”
        text = “”
    Else
        ActiveCell.ColumnWidth = dblWidth
    End If
End Sub
如下图所示,在编辑框中输入数值并回车后,当前单元格所在的列宽将根据数值进行调整。


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

本版积分规则

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

GMT+8, 2024-5-7 12:02 , Processed in 0.065776 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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