• Ribbon2: 创建动态的Ribbon库


    Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个是带有标签的小图表图像,一个是大的图像。如图1和图2所示。
    CreateDynamicGallery1
    图1:小图形库
    CreateDynamicGallery2
    图2:大图形库
    带有完整的RibbonX和VBA代码的示例文档见:

    下面对其进行简单的介绍。
    RibbonX
    先从RibbonX代码开始。RibbonX简单的解释就是定义Ribbon外观的XML。对于本例,RibbonX将定义所放置的两个库的位置、库按钮以及在库中的项目,RibbonX已存在于文档中,必须使用工具来获取文档中的RibbonX代码,您可以使用Office 2007 Custom UI Editor。打开“Office 2007 Custom UI Editor”,然后打开“Charts_In_Ribbon.xlsm”文档,其中的XML代码如下:
    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="ribbonLoaded"><ribbon><tabs><tab idMso="TabHome"><group id="grpChartsInRibbon" label="Charts"> <gallery id="galSmallCharts"                           label="Small Charts"                           size="large"                           showLabel="true"                           imageMso="ChartPlacement"                           columns="1"                           rows="5"                           itemHeight="90"                           itemWidth="150"                           supertip="Small pictures of your charts!"                           getItemCount="getItemCount"                           getItemID="getItemID"                           getItemImage="getItemImage"                            getItemSupertip="getItemSupertip"                           getItemLabel="getItemLabel"                           onAction="galRefreshAction"/> <gallery id="galBigCharts"                           label="Big Charts"                           size="large"                           showLabel="true"                           imageMso="ChartPlacement"                           columns="2"                           rows="2"                           itemHeight="291"                           itemWidth="483"                           supertip="Large pictures of your charts!"                           getItemCount="getItemCount"                           getItemID="getItemID"                           getItemImage="getItemImage"                            getItemSupertip="getItemSupertip"                           onAction="galRefreshAction"/> </group></tab></tabs></ribbon></customUI>

    如果创建一个新文档并在Office 2007 Custom UI Edtior中打开该文档,则不会看到任何内容,因为该文档中没有RibbonX。下面,我们来介绍一个这个Ribbon XML的关键点:
    回调
    这里,告诉功能区调用VBA函数来获取:库中的项目数、项目的标签、悬浮在项目上时显示的工具提示。例如在RibbonX中:

    getItemCount="getItemCount"

    红色的getItemCount是RibbonX属性,告诉功能区去调用VBA函数来获取项目数,蓝色的getItemCount是要调用的VBA函数名称。如果想指定固定的项目数,则应使用:

    ItemCount="4"

    Ribbon对象
    在customUI标签中添加

    onLoad="ribbonLoaded"

    将允许VBA代码获取ribbon对象的一个句柄,允许我们使ribbon无效。使该ribbon无效将强制ribbon在下次用户进入库时调用库程序(回调),为我们提供了更新库中项目和图像的一种方式。在下面的VBA部分将介绍如何使ribbon无效。
    库的位置
    在本示例中,我们在“开始”选项卡中创建了一个新组:

    idMso="TabHome"

    。因为我们没有指定“insertbefore”属性,因此将新按钮排在“开始”选项卡的右侧。
    在库按钮中的图像
    这里,为库按钮图像选取了一个已存在的ribbon图标:
    CreateDynamicGallery4
    这种结果是通过

    imageMso="ChartPlacement"

    来定义的。可以为每个按钮使用不同的图标,或者通过回调或定义图像属性装载自已的图标。
    小库或大库
    两个库对代码有相同的回调,因为它们的项目数和图表图片是相同的,它们在RibbonX里的不同是:

    • 对于小库,itemWidth和itemHeight属性被设置得比大库更小。
    • 小库有另一个回调,来定义库中每个图表的标签。由于在小库中的图表更小,所以添加标签能帮助识别图表。
    • 对小库有更少的列,但有更多的行。设置小库为单列来帮助创建小库和大库之间不同的视图。

    VBA代码
    本例中,oRibbon对象是Ribbon,将使用其来使Ribbon无效,以便可以强制更新库。

    Public oRibbon As IRibbonUI

    当ribbon装载RibbonX时,调用接下来的sub过程,传递Ribbon对象,这是获取Ribbon对象的唯一方式。该代码设置公共的ribbon对象为后面使用:

    Public Sub ribbonLoaded(Ribbon As IRibbonUI)Set oRibbon = RibbonEnd Sub

    当用户在库中单击时,调用“getItemCount”,ribbon需要清楚其显示什么。因为我们在RibbonX中定义了回调,指定在库中有多少项。
    注意本例中的OnTime方法,如何使ribbon无效。默认情况下,ribbon将调用所有回调一次来获取项目和图像,并隐藏这些值直至使它们无效。这里,每次用户在库中单击时,使图像失效。处理这种操作有更顺畅的方法,但本示例将保持简单的方式。

    Sub getItemCount(control As IRibbonControl, ByRef count)count = ActiveSheet.ChartObjects.countApplication.OnTime DateAdd("s", 1, Now), "InvalidateRibbon"End Sub

    下一个程序为库中每个项目调用,将设置项目在库中显示的图像。本例中,想使所有的图像都在这里,因此Ribbon带有一个索引值,只是告诉索引的图表,然后告诉ribbon使用该图像。

    Sub getItemImage(control As IRibbonControl, index As Integer, ByRef image)ActiveSheet.ChartObjects(index + 1).Chart.Export ThisWorkbook.Path & "Chart_" & index + 1 & ".jpg", "jpg"Set image = LoadPicture(ThisWorkbook.Path & "chart_" & index + 1 & ".jpg")End Sub

    “getItemID”程序在通过ribbon获取库项目的id时调用。在本示例中我们不使用。

    Sub getItemID(control As IRibbonControl, index As Integer, ByRef id)id = "Chart_" & indexEnd Sub

    下一个回调定义每个库项目的工具提示,或者超级工具提示。在本示例中,工具提示是series名称和公式,提供用户其原理或来源于哪里。这虽然不是特别有帮助的,但有趣。

    Sub getItemSupertip(control As IRibbonControl, index As Integer, ByRef supertip)Dim oSeries As SeriesDim sTooltip As StringFor Each oSeries In ActiveSheet.ChartObjects(index + 1).Chart.SeriesCollectionsTooltip = sTooltip & vbCrLf & oSeries.Name & vbCrLf & oSeries.Formula & vbCrLfNext oSeriessupertip = sTooltipEnd Sub

    “getItemLabel”回调仅被小库调用,通过RibbonX来定义,将设置库项目的标签。本例中,将使用图表标题作为标签,如果不存在则使用图表名称。

    Sub getItemLabel(control As IRibbonControl, index As Integer, ByRef label)If ActiveSheet.ChartObjects(index + 1).Chart.HasTitle Thenlabel = ActiveSheet.ChartObjects(index + 1).Chart.ChartTitle.CaptionElselabel = ActiveSheet.ChartObjects(index + 1).NameEnd IfEnd Sub

    下一个程序当用户在库项目中单击后调用。例如,用户单击某图表,代码将滚动到该图表并激活该图表。

    Sub galRefreshAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)ActiveWindow.ScrollIntoView ActiveSheet.ChartObjects(selectedIndex + 1).Left, ActiveSheet.ChartObjects(selectedIndex + 1).Top, ActiveSheet.ChartObjects(selectedIndex + 1).Width, ActiveSheet.ChartObjects(selectedIndex + 1).HeightActiveSheet.ChartObjects(selectedIndex + 1).ActivateEnd Sub

    <customUIxmlns="http://schemas.microsoft.com/office/2006/01/customui" ..>

    <commands>

    <command ... />

    </commands>

    <ribbon ...>

    <officeMenu>可用于Office菜单中的任何控件类型</officeMenu>

    <qat>

    <sharedControls>

    <control>,<button> or <separator>控件类型

    </sharedControls>

    <documentControls>

    <control>,<button> or <separator>控件类型

    </documentControls>

    </qat>

    <tabs>

    <tab ... >

    <group ... >所有控件类型</group>

    </tab>

    </tabs>

    <contextualTabs>

    <tabSetidMSO="TabSetChartTools">

    <tab ... >

    <group ... >所有控件类型</group>

    </tab>

    </tabSet>

    </contextualTabs>

    </ribbon>

    </customUI>

    其中,省略号表示一个或多个可选的属性。可以看出,RibbonX代码结构是层次分明的。现在,让我们初步了解代码结构

     

    <customUI>元素是XML的根容器,命名空间将其识别为RibbonX文档
    <commands>元素用来重复利用内置控件
    <ribbon>元素包含功能区中所有可以利用的元素。可以包含下列元素以控制功能区的相应部分。
    <officeMenu>元素用来定制Office菜单。
    <sharedControls>元素代表共享控件。
    <documentControls>元素代表文档控件。
    <qat>元素用来定制快速访问工具栏。
    <tabs>元素表示选项卡的集合。
    <tab>元素创建选项卡。
    <contextualTabs>元素创建上下文选项卡。
    <group>元素用来创建组。
     
     
    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><!--customUI 元素是XML的跟容器,命名空间将其识别为ribbonX文档。-->
     <!--commands元素用来重复利用内置控件-->
     <commands>
      <command idMso="FileSave" enabled="false"/><!--command元素能够重载命令或者禁用命令。例如,下面的XML禁用“保存”命令.-->
     </commands>
     <!--ribbon元素包含功能区中所有可以利用的元素.-->
     <ribbon startFromScratch="false">
      <!--OfficeMenu元素用来定制Office菜单。可以向该元素中添加可用于Office菜单中的任何控件类型,例如以下添加了一个button按钮和一个级联菜单-->
      <officeMenu>
       <!--在Office菜单中添加命令按钮,标签的文本为“我的按钮”-->
       <button id="Mybut" label="我的按钮"/>
       <!--在office菜单中添加菜单,-->
       <menu id="MyMenu" label="我的菜单">
        <!--在菜单中添加命令按钮-->
        <button id="MyMenuBut" label="我的二级命令"/>
       </menu>
      </officeMenu>
      <!--qat元素用来定制快速访问工具栏。-->
      <tabs>
       <tab id="MyTab" label="我的选项卡"> <!--Tab元素用来添加选项卡-->
        <group id="MyGroup" label="我的分组"><!--group元素用来在选项卡中创建分组-->
         <button id="MyZuBut" label="我的组按钮"/><!--group元素中可以添加所有控件类型-->
        </group>
       </tab>
      </tabs>
      <contextualTabs><!--contextualTabs 元素用来创建上下文选项卡-->
        <tabSet idMso="TabSetChartTools" />
      </contextualTabs>
     </ribbon>
    </customUI>

    checkBox控件能够使用户在两种状态之间切换。虽然默认情况下状态是真和假,但是该元素能够指明开/关、上/下、左/右、1/0、或者任何可以想象到的相对状态组合。

    您可能想使用checkBox来做下列操作:

    ²        表明数据库中的某字段是否满足特定的条件。在这种情况下,当满足条件时,将自动选中复选框。

    ²        允许用户确定是否显示某对象,例如显示或隐藏网格线,或者子窗体。

    1、checkBox元素必需的属性

    复选框控件需要下表1所列的id属性之一。

    表1:checkBox元素必需的属性

    属性

    何时使用

    id

    当创建自已的复选框时

    idMso

    当使用现有的Microsoft复选框时

    idQ

    当在命名空间之间创建共享的复选框时

    每个复选框控件也需要表2所列出的onAction回调。

    表2:checkBox元素必需的回调

    动态属性

    允许值

    VBA回调签名

    onAction

    1至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回调签名

    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)

    keytip

    getKeytip

    1至3个字符

    (none)

    Sub GetKeytip(control As                                             IRibbonControl,

    ByRef returnedVal)

    label

    getLabel

    1至1024个字符

    (none)

    Sub GetLabel(control As                                              

    IRibbonControl,

    ByRef returnedVal)

    (none)

    getPressed

    true,false,1,0

    false

    Sub GetPressed(control As IRibbonControl,

    ByRef returnedVal)

    screentip

    getScreentip

    1至1024个字符

    (none)

    Sub GetScreentip(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)

    3、checkBox元素允许的子对象

    checkBox控件不支持任何子对象。

    4、checkBox元素的父对象

    在下列任何控件内都能放置checkBox控件:

    Ø         box

    Ø         dynamicMenu

    Ø         group

    Ø         menu

    Ø         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>

    下图为上述代码创建的组:

    checkboxsample1

    您也可以修改该控件的名字,使用下面的XML代替相应的语句:

                        <checkBox idMso=“GridlinesExcel“

                           label=“Toggle Gridlines“/>

    此时,显示的界面如下图所示:

    checkboxsample2

    6、创建自定义复选框控件

    使用Excel时,便利的事情之一是迅速在工作簿中切换A1和R1C1样式公式的能力。在一些情形下,使用R1C1引用的公式将更好。下面的示例演示如何容易地快速切换两种引用形式的公式。

    本示例在“公式”选项卡中添加一个控件,省去了必须通过Office菜单来找到该设置的复选框的麻烦。如下图所示,添加的新复选框控件在最右侧的“Other Settings”组中。

    checkboxsample3 

    首先,新建一个工作簿,保存后关闭。然后使用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,其目的是:

    Ø         rxIRibbonUI_onLoad存储RibbonUI对象,能够使控件无效以便随后强制更新控件。

    Ø         当第一次激活“公式”选项卡(或使无效)并适当地设置复选框时触发rxchkR1C1_getPressed。

    Ø         无论何时选中或取消选中复选框都将触发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引用样式后不会立即更新,您需要激活另一工作表后再返回该工作表,即可更新了。

    图表初步了解(Chart)

    1,  图表(Chart)的位置

    a)         作为嵌入对象放在工作表中,一个工作表(Sheet)中可以存放多个图表(Chart);

    b)         放在一个单独的图表工作表中,一个图表工作表通常包含一个图表(Chart)

    2,  Chart对象模型

    a)         对于嵌入式图表

     Application->Workbook->WorkSheet->ChartObject->Chart

    b)         对于图表工作表

    Application->Workbook->Chart

    注:图表工作表本质上是一个Chart,而且不包含ChartObject对象。也就是说,嵌入式图表的父对象是ChartObject对象,而一个图表工作表的父对象是Workbook对象。

    ChartObject对象表示工作表中的嵌入图表,它的作用是作为Chart对象的容器,也就是说用它来装Chart对象。所以控制嵌入图表的外观和尺寸需要用ChartObject的属性和方法,而图表内部的控制则需要用Chart对象的属性和方法。


    3,创建图表(Chart)

        创建嵌入式图表

        在Excel 2007中ChartObject是一种特殊的Shape对象,它是Shapes集合的一个成员。要创建一个新的图表,可以使用Shapes集合的AddChar方法:

        Sub CreateChart()

          Dim myChart As Chart

          Dim myShape As Shape

          Set myChart = Worksheets("sheet1").Shapes.Addchart(xlLineMarkers).Chart

          Set myShape = Worksheets("sheet1").Shapes.Addchart(xlLineMarkers)

    End Sub

    以上是Excel 2007中添加图表的新方法,为了兼容,可使用ChartsObjects集合的Add方法。该方法与Shapes集合的AddChart方法的区别是,它不允许将图表类型指定为一个参数,但需要Left,Top,Width,Height参数。例如:

    Sub CreateChart()

       Dim myChart As Chart                                                  Left Top  Width Height

       Set myChart = Worksheets("sheet1").ChartObjects.Add( 10,  10,   354,  250).Chart

    End Sub

    创建图表工作表

    要在图表工作表上创建图表(Chart)则可使用Charts集合的Add方法,但Charts集合的Add方法使用的可选参数指定的事图表工作表的位置---而非图表的相关信息。

    Sub CreateChartSheet()

       Dim myChart As Chart

       Set myChart = Charts.Add

    End Sub

    4,删除图表(Chart)

            删除嵌入式图表

            要删除嵌入式图表,就必须知道ChartObject的名称或索引。下列语句删除活动工作表上的名为Chart 1的ChartObject删除。

                ActiveSheet.ChartObjects("chart 1").Delete

    删除所有的ChartObject对象,可以使用ChartObjects集合的Delete方法:

                ActiveSheet.ChartObjects.Delete

    也可通过访问Shapes集合来删除嵌入式图表:

                ActiveSheet.Shapes("chart 1").Delete

            而

                ActiveSheet.Shapes.Delete   删除了所有图表和其他所有图形。

            删除图表工作表

            Charts("chart 1").Delete   而 ActiveWorkbook.Charts.Delete  删除活动工作簿所有的图表工作表

    切换按钮用于在两种状态之间选择,例如当按下某切换按钮时开启或关闭某功能。

    1、toggleButton元素必需的属性

    切换按钮需要下表1所列的id属性之一。

    表1:toggleButton元素必需的属性

    属性

    何时使用

    id

    当创建自已的切换按钮时

    idMso

    当使用现有的Microsoft切换按钮时

    idQ

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

    切换按钮也需要表2所列出的onAction回调。

    表2:toggleButton元素必需的回调

    动态属性

    允许值

    VBA回调签名

    onAction

    1至4096个字符

    Sub OnAction(control As IRibbonControl,

    selectedId As String,

    selectedIndex As Integer)

    2、带有回调签名的可选的静态属性和动态属性

    使用切换按钮时,可以使用下表3列出的任一insert属性。

    表3:toggleButton元素可选的insert属性

    INSERT属性

    允许值

    默认值

    何时使用

    insertAfterMso

    有效的Mso组

    在组末尾插入

    在Microsoft控件之后插入

    insertBeforeMso

    有效的Mso组

    在组末尾插入

    在Microsoft控件之前插入

    insertAfterQ

    有效的组idQ

    在组末尾插入

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

    insertBeforeQ

    有效的组idQ

    在组末尾插入

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

    也可以提供下表4所列的任何或所有的属性。

    表4:toggleButton元素可选的属性和回调

    静态属性

    动态属性

    允许值

    默认值

    动态属性的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至4096个字符

    (none)

    Sub GetImage(control As                                             

    IRibbonControl,

    ByRef returnedVal)

    imageMso

    getImage

    1至4096个字符

    (none)

    同上

    keytip

    getKeytip

    1至3个字符

    (none)

    Sub GetKeytip(control As                                             

    IRibbonControl,

    ByRef returnedVal)

    label

    getLabel

    1至4096个字符

    (none)

    Sub GetLabel(control As                                              

    IRibbonControl,

    ByRef returnedVal)

    (none)

    getPressed

    true,false,1,0

    (none)

    Sub GetPressed(control As

    IRibbonControl,

    ByRef returnedVal)

    screentip

    getScreentip

    1至4096个字符

    (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至4096个字符

    (none)

    Sub GetSupertip(control As

    IRibbonControl,

    ByRef returnedVal)

    tag

    (none)

    1至4096个字符

    (none)

    (none)

    visible

    getVisible

    true,false,1,0

    true

    Sub GetVisible(control As

    IRibbonControl,

    ByRef returnedVal)

    3、toggleButton元素允许的子对象

    toggleButton控件不支持任何子对象。

    4、toggleButton元素的父对象

    在下列任何控件内都能放置toggleButton控件:

    n         box

    n         buttonGroup

    n         dynamicMenu

    n         group

    n         menu

    n         officeMenu

    n         splitButton

    5、使用内置的切换按钮控件

    在功能区中使用了很多内置的切换按钮控件。下面的示例在自定义选项卡中添加四个内置的切换按钮。

    (1)创建一个新的.xlsx文件,并将其保存为Excel Built In toggleButton Example.xlsx。

    (2)关闭该文件并在CustomUI Editor中打开。

    (3)输入下列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=“rxgrpFormats“

                           label=“Formatting“>

                        <toggleButton idMso=“Bold“/>

                        <toggleButton idMso=“Italic“/>

                        <toggleButton idMso=“Underline“/>

                        <toggleButton idMso=“UnderlineDouble“/>

                    </group>

                </tab>

            </tabs>

        </ribbon>

    </customUI>

    (4)保存并关闭CustomUI Editor。在Excel中打开工作簿,如下图所示。

    togglebuttonsample1

    6、创建自定义切换按钮控件

    下面的示例再次使用在细品RibbonX(18)中使用的预付费用计划示例,我们将添加自定义视图切换功能,这样允许用户显示或隐藏“Expense To”列,如下图所示。

    togglebuttonsample2

     在Excel中,单击“视图—自定义视图”,选择“添加”并命名为“cvw_Show”。该视图用于返回工作表的全视图,显示所有列。关闭“视图管理器”对话框。

    接着,设置隐藏“Expense To”列的第二个视图。隐藏F列,重新打开“视图管理器”对话框,添加一个名为“cvw_Hide”的新的自定义视图。关闭“视图管理器”对话框。

    现在,录制切换视图的宏。单击“录制宏”按钮,开始录制:

    (1)单击“视图”选项卡。

    (2)单击“自定义视图”。

    (3)选择cvw_Hide视图并选择“显示”。

    (4)再次单击“自定义视图”。

    (5)选择cvw_Show视图并选择“显示”。

    (6)停止录制。

    转到VBE中,查看录制的代码:

        ActiveWorkbook.CustomViews(”cvw_Hide”).Show

        ActiveWorkbook.CustomViews(”cvw_Show”).Show

    接下来,让我们设置功能区中所自定义的切换按钮。保存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“/>

                        <toggleButton id=“rxtglHideExpense“

                                      label=“Hide Expenses“

                                      imageMso=“FieldList“

                                      size=“large“

                                      onAction=“rxtglHideExpense_Click“/>

                    </group>

                </tab>

            </tabs>

        </ribbon>

    </customUI>

    生成回调签名并复制,保存并关闭文件。

    在Excel中重新打开该文件,转到VBE中,粘贴回调签名代码。

    下面,修改回调以满足需要,代码如下:

    ‘rxtglHideExpense onAction回调

    Sub rxtglHideExpense_Click(control As IRibbonControl, pressed As Boolean)

        Select Case pressed

            Case True

                ActiveWorkbook.CustomViews(”cvw_Hide”).Show

            Case False

                ActiveWorkbook.CustomViews(”cvw_Show”).Show

        End Select

    End Sub

    好了!现在可以转到Excel界面中查看切换按钮的功能了。

    然而,如果您隐藏了F列,保存并关闭工作簿,再打开该工作簿时,切换按钮并不会高亮选中,并且需要单击两次才能实现切换功能。此时,可以使用下列方式解决:

    n         在Workbook_Open过程中将cvw_Show视图设置为活动的。

    n         设置getPressed回调代码测试当工作簿打开时哪个视图为活动视图,然后将其状态返回到切换按钮。

    下面再举一个示例。

    本示例使用一个切换按钮来切换分页显示。如下面的XML代码所示,在“视图”选项卡中自定义一个组并放置自定义的切换按钮:

    togglebuttonsample3 

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

        <ribbon startFromScratch=“false“>

            <tabs>

                <tab idMso=“TabView“>

                    <group id=“rxgrpStyleInsp“

                           label=“Custom Options“

                           insertBeforeMso=“GroupZoom“>

                            <toggleButton id=“rxtglPageBreaks“

                                   label=“Display PageBreaks“

                                   getPressed=“rxtglPageBreaks_getPressed“

                                   getImage=“rxtglPageBreaks_getImage“

                                   onAction=“rxtglPageBreaks_click“/>

                   </group>

                </tab>

            </tabs>

        </ribbon>

    </customUI>

    生成回调签名,并将其复制。关闭CustomUI Editor。

    在Excel中打开该工作簿,转到VBE,粘贴回调签名到标准模块中,并输写代码:

    Private ribbonUI As IRibbonUI

    ‘customUI.onLoad回调

    Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)

        Set ribbonUI = ribbon

    End Sub

    ‘rxtglPageBreaks getPressed回调

    Sub rxtglPageBreaks_getPressed(control As IRibbonControl, ByRef returnedVal)

        returnedVal = ActiveSheet.DisplayPageBreaks

    End Sub

    ‘rxtglPageBreaks getImage回调

    Sub rxtglPageBreaks_getImage(control As IRibbonControl, ByRef returnedVal)

        Select Case ActiveSheet.DisplayPageBreaks

            Case True

                returnedVal = “SignatureInsertMenu”

            Case False

                returnedVal = “DesignMode”

        End Select

    End Sub

    ‘rxtglPageBreaks onAction回调

    Sub rxtglPageBreaks_click(control As IRibbonControl, pressed As Boolean)

        ActiveSheet.DisplayPageBreaks = pressed

        ribbonUI.InvalidateControl “rxtglPicHold”

    End Sub

    保存该工作簿并关闭。重新打开该工作簿,此时可以测试该切换按钮的功能了。
    下面介绍修改QAT中宏按钮或内置按钮图标的方法。
    如下图所示,在QAT中添加一个宏。
    ChangeAQTImageSample1
    Excel将QAT的设置保存在名为Excel.qat的文件中,该文件位于:

    C:Documents and Settings\Local SettingsApplication DataMicrosoftOfficeExcel.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 SettingsAdministrator桌面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 SettingsAdministrator桌面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 SettingsAdministrator桌面ChangeAQTImageSample.xlsm!MyMacro" imageMso="M"/>
    修改后如下图所示。
    ChangeAQTImageSample2
    若要修改内置按钮的图像,同样修改为imageMso=”M”或者其他图像。
    当然,你也可以将文件名更改为压缩文件后缀,然后解压缩,修改相应的qat代码来修改按钮的图像。
    自己做主的兼职网------威客网

    最终的结果
    在定义了RibbonX和VBA代码之后,打开该文档将显示两个新库,点击每个库的下拉箭头后,将显示工作表中最近图表的图像,单击库中的某图表将到达该图表。
    您可以修改本示例,以达到更丰富的效果。
    如果将本示例作为一个加载项,将可以在所有工作簿中使用。
    目前,本示例只是遍历活动工作表的图表,可以修改以显示整个工作簿中的图表,甚至是所有打开的工作簿中的图表。
    参考资源:
    http://msdn2.microsoft.com/en-us/office/aa905530.aspx
    http://msdn2.microsoft.com/en-us/office/aa905356.aspx
    http://msdn2.microsoft.com/en-us/library/aa338199.aspx

  • 相关阅读:
    TP5.0防跳墙访问
    TP5.0上传添加数据库
    抽象类与接口
    instanceof 关键字
    abstract 抽象类
    extends 继承
    单例模式
    类的加载过程和对象的创建
    静态成员变量和非静态成员变量的区别
    this关键字
  • 原文地址:https://www.cnblogs.com/lijiu/p/3832117.html
Copyright © 2020-2023  润新知