ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > 细品RibbonX(39):技巧—使用VBA自定义功能区元素属性

细品RibbonX(39):技巧—使用VBA自定义功能区元素属性

作者:绿色风 分类: 时间:2022-08-17 浏览:179
楼主
biaotiger1
除了使用类创建自定义属性外,也可以为许多对象(例如工作簿、工作表,等)创建自定义属性。此外,在给对象定义自定义属性之后,属性作为对象的成员被公开,例如:
  1. 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="GroupInsertTable**cel"
    38.                       getVisible="GroupInsertTable**cel_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 GroupInsertTable**cel_getVisible(control As IRibbonControl, ByRef returnedVal)
    24.     returnedVal = True
    25.     If control.ID = "GroupInsertTable**cel" 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对象相关的不同的属性。
  • 2楼
    じ☆潴の︵ゞ
    学习了

    免责声明

    有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
    ------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

    评论列表
    sitemap