前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA专题10-20:使用VBA操控Excel界面之隐藏和取消隐藏控件、组和选项卡

VBA专题10-20:使用VBA操控Excel界面之隐藏和取消隐藏控件、组和选项卡

作者头像
fanjy
发布于 2021-03-12 09:02:59
发布于 2021-03-12 09:02:59
8.5K00
代码可运行
举报
文章被收录于专栏:完美Excel完美Excel
运行总次数:0
代码可运行

excelperfect

内置控件(不被允许)

不能够单独隐藏内置组中的内置控件。然而,可以隐藏内置组,因此会隐藏该组中的所有控件。可以单独禁用(和启用)组中的控件。

下表中的command元素的可用属性说明了为什么不能够隐藏但可以单独禁用(和启用)内置控件。另一方面,group和tab元素的可用属性说明了为什么可以隐藏(和取消隐藏)但不能够禁用组和选项卡。

上面的表也展示了通用理念,一些属性(enabled,label,visible …)可以在设计时设置它们的值,一些属性(getEnabled,getLabel, getVisible …,称作回调属性)可以在启动(当Excel开启时)动态设置值,可以在运行时改变它们的值(在使元素无效后通过使用VBA回调过程)。

内置控件组

通过使用visible属性,可以在设计时永久隐藏控件组。或者,可以通过使用getVisible回调属性动态地隐藏(和取消隐藏)它们。visible是设计时属性,而getVisible是运行时属性。

例如,下面的示例XML代码永久隐藏“开始”选项卡中的“字体”组和“对齐方式”组:

隐藏“字体”组和“对齐方式”组后的“开始”选项卡如下图所示:

虽然隐藏了组中的控件,但是仍然可以通过快捷键组合和上下文菜单执行它们底层的命令,例如,选择工作表单元格,按下Ctrl+B将使单元格内容加粗,右击单元格将显示“单元格”上下文菜单和Mini工具栏。

正如本文开头提到的,也可以在满足某条件时在运行时动态地隐藏(和取消隐藏)内置组。这样的例子包括:选择了图表工作表、选择了特定的工作表、从组合框中选择了特定项、以及勾选了网格线复选框。

例如,下面的示例XML代码和在标准VBA模块中的代码在运行时满足某条件时隐藏(和取消隐藏)“对齐方式”组:

customUI元素包括带有Initialize回调过程的onLoad属性。当打开工作簿时执行该回调。

GroupAlignmentExcel组元素包括getVisible属性。通过该属性指向HideAlignmentGroup过程,在打开工作簿或使该控件无效时执行。在该过程中评估是否隐藏或取消隐藏组的条件。

在Custom UI Editor中保存该文件,首次在Excel中打开时,会出现关于Initialize和HideAlignmentGroup过程的错误消息提示,因为这两个过程仍然没有在标准的VBA模块中找到,单击“确定”关闭错误消息。

打开VBE,在标准VBA模块中的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public myRibbon As IRibbonUI
 
'Callback for customUI.onLoad
Sub Initialize(ribbon As IRibbonUI)
    Set myRibbon = ribbon
End Sub
 
'Callback for GroupAlignmentExcel getVisible
Sub HideAlignmentGroup(control As IRibbonControl, ByRef returnedVal)
    returnedVal = TypeName(ActiveSheet) ="Worksheet"
End Sub

在HideAlignmentGroup过程中,如果活动工作表是标准工作表,那么returnedVal参数设置为True,结果是“文本对齐”组可见。如果returnedVal参数设置为False,那么该组被隐藏。

在ThisWorkbook模块的SheetActivate事件处理中的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '在Excel 2010及以后版本,使用下面的代码语句:
    myRibbon.InvalidateControlMso "GroupAlignmentExcel"
 
    '由于Excel 2007没有InvalidateControlMso方法
    '使用下面的语句使功能区无效
    'myRibbon.Invalidate
End Sub

当激活不同的工作表时,执行SheetActivate事件处理。在Excel 2010及之后的版本中,InvalidateControlMso方法仅使“对齐方式”组无效。在Excel 2007中,Invalidate方法使功能区无效。随后,调用HideAlignmentGroup过程。如果活动工作表不是标准工作表,就隐藏该组,否则该组可见。

注意,当打开工作簿时,创建ribbon对象。编辑VBA代码可能销毁这个新创建的对象。试图使与销毁对象相关的控件无效是不可能的,唯一的办法是重新创建ribbon对象重新打开该工作簿。

当激活图表工作表时,“开始”选项卡中的“对齐方式”组被隐藏,如下图所示:

事实上,可以只是使用一个回调过程来隐藏多个组。这种只使用一个回调的思想可以被扩展到选项卡和控件,稍后我们会谈到这方面的内容。

内置选项卡

例如,下面的示例XML代码隐藏“开始”和“数据”选项卡:

隐藏“开始”和“数据”选项卡的功能区如下图所示:

虽然选项卡中的控件被隐藏,但仍然可以通过快捷键组合和上下文菜单执行它们底层的命令。例如,选择非空工作表单元格,按Alt+D+S将显示“排序”对话框,按Ctrl+H显示“查找和替换”对话框,右击单元格将显示单元格上下文菜单和Mini工具栏。

与隐藏(和取消隐藏)内置组相似,可以在运行时当满足某条件时动态地隐藏(和取消隐藏)内置选项卡。例如,运行时当满足某条件时,下面的示例XML代码和VBA代码可以隐藏(和取消隐藏)“开始”选项卡:

在标准VBA模块中的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public myRibbon As IRibbonUI
 
'Callback for customUI.onLoad
Sub onLoad(ribbon As IRibbonUI)
    Set myRibbon = ribbon
End Sub
 
'Callback for TabHomegetVisible
Sub HideHomeTab(control As IRibbonControl, ByRef returnedVal)
    returnedVal = TypeName(ActiveSheet) ="Worksheet"
End Sub

当调用HideHomeTab过程时,如果活动工作表不是标准工作表,那么隐藏“开始”选项卡,否则使“开始”选项卡可见。

在ThisWorkbook模块中的SheetActivate事件处理代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    '在Excel 2010 及其后的版本中,使用下面的代码语句:
    myRibbon.InvalidateControlMso "TabHome"
   
    '由于Excel 2007没有InvalidateControlMso方法,
    '使用下面的语句使Ribbon无效:
    'myRibbon.Invalidate
End Sub

当激活不同的工作表时,执行SheetActivate事件处理。在Excel 2010及之后的版本中,InvalidateControlMso方法仅使“开始”选项卡无效——仅仅是该选项卡被无效,在“开始”选项卡中的控件实际上没有被无效。在Excel 2007中,Invalidate方法使功能区中所有的控件无效。随后,调用HideHomeTab过程。如果活动工作表不是标准工作表,就隐藏“开始”选项卡,否则该选项卡可见。

所有内置选项卡

示例XML代码:

功能区的所有选项卡都被隐藏,如下图所示:

虽然所有的内置选项卡都被隐藏,但仍然可以通过快捷键组合、上下文菜单和上下文选项卡访问内置控件。例如,按Alt+I+S将显示“符号”对话框,按Alt+F1将插入一个空的嵌入式图表并显示“图表工具”上下文选项卡,右击工作表单元格将显示单元格上下文菜单和Mini工具栏。

自定义控件

不能够单独隐藏内置控件,但可以单独隐藏自定义控件。可以在设计时永久地或者在运行时动态地隐藏(和取消隐藏)自定义控件。然而,动态地隐藏(和取消隐藏)控件更可取,可以设置自已的条件来是否使控件隐藏。

例如,下面的示例XML代码在“开始”选项卡中的“字体”组前添加3个按钮:

注意,两个按钮的getVisible属性都使用了相同的getVisibleBtnBC回调过程。当打开工作簿或者当其中一个或两个控件被无效时执行该回调。

在标准VBA模块中的VBA代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public myRibbon As IRibbonUI
 
'Callback for customUI.onLoad
Sub Initialize(ribbon As IRibbonUI)
    Set myRibbon = ribbon
End Sub
 
'Callback for BtnB getVisible
Sub getVisibleBtnBC(control As IRibbonControl,ByRef returnedVal)
    returnedVal = ActiveSheet.Name ="Sheet1"
End Sub

当调用getVisibleBtnBC过程时,如果活动工作表的名称是Sheet1,那么使BtnB和BtnC按钮可见,否则这两个按钮隐藏。

在ThisWorkbook模块中的SheetActivate事件处理代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    myRibbon.InvalidateControl "BtnB"
    myRibbon.InvalidateControl "BtnC"
End Sub

当激活不同的工作表时,执行SheetActivate事件处理,使BtnB和BtnC按钮无效。随后,调用相同的getVisibleBtnBC过程,遍历所有无效的控件(本例中,是两个按钮),它们的getVisible属性使用相同的getVisibleBtnBC过程。如果活动单元格的名称是Sheet1,那么这两个按钮可见,否则被隐藏。

自定义组和选项卡

隐藏(和取消隐藏)自定义组和选项卡的方法与隐藏(和取消隐藏)内置组和选项卡的方法相同。下面展示了一个示例,当活动工作表不是标准工作表时隐藏自定义选项卡。

示例XML代码:

在标准VBA模块中的VBA代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public myRibbon As IRibbonUI
 
'Callback for customUI.onLoad
Sub Initialize(ribbon AsIRibbonUI)
    Set myRibbon = ribbon
End Sub
 
'Callback for customTabgetVisible
Sub HideCustomTab(control As IRibbonControl, ByRef returnedVal)
    returnedVal = TypeName(ActiveSheet) ="Worksheet"
End Sub

在ThisWorkbook模块中的SheetActivate事件处理代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    myRibbon.InvalidateControl "CustomTab"
End Sub

说明:本专题系列大部分内容学习整理自《Dissectand Learn Excel VBA in 24 Hours:Changingworkbook appearance》,仅供学习研究。注:如果你有兴趣,你可以到知识星球App的完美Excel社群下载这本书的完整中文版电子书。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡
通过分别使用enabled属性和getEnabled属性,可以在设计时永久地或者在运行时动态地禁用(和启用)内置控件。被禁用的控件在功能区中显示的是灰色。
fanjy
2021/03/26
3.6K0
VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡
VBA专题10-24:使用VBA操控Excel界面之单元格上下文菜单(Excel 2010及以后的版本)
假设你需要对工作表中前面有货币符号的值执行计算,然而那些值被解释为文本,你要编写VBA过程来移除所选单元格区域中的货币符号。要使该过程更易访问,你想在单元格上下文菜单中放置其快捷方式。下面的XML代码和VBA代码完成上述任务。
fanjy
2021/03/26
1.6K0
VBA专题10-24:使用VBA操控Excel界面之单元格上下文菜单(Excel 2010及以后的版本)
VBA专题10-25:使用VBA操控Excel界面之一个示例程序
在前面的一系列主题中,你已经学到了很多小的修改工作簿外观的VBA代码。下面,我们将介绍一个简单的示例程序,实现下面的功能特点:
fanjy
2021/03/26
2.5K0
VBA专题10-25:使用VBA操控Excel界面之一个示例程序
VBA实战技巧19:根据用户在工作表中的选择来隐藏/显示功能区中的剪贴板组
有时候,我们可能想根据用户在工作表中的选择来决定隐藏或者显示功能区选项卡中的特定组,避免用户随意使用某些功能而破坏我们的工作表结构。
fanjy
2021/03/12
4.5K0
VBA专题10-23:使用VBA操控Excel界面之添加动态菜单
在本系列后面的示例程序中,你将会看到如何使用项目和带图像的库控件通过getItemLabel和getItemImage回调属性引用的VBA过程在运行时动态地填充下拉控件。另一个允许动态填充其内容的控件是组合框控件。
fanjy
2021/03/26
6.5K0
VBA专题10-23:使用VBA操控Excel界面之添加动态菜单
VBA专题10-15:使用VBA操控Excel界面之在功能区中添加自定义标签控件
3. 在CustomUI Editor中,单击“插入”并选择“Office 2007 Custom UI Part”。
fanjy
2021/03/12
2.5K0
VBA专题10-6:使用VBA操控Excel界面之执行命令以及激活功能区选项卡的两种方法
Application.CommandBars.ExecuteMso(idMso)
fanjy
2020/09/25
4.1K0
VBA专题10-6:使用VBA操控Excel界面之执行命令以及激活功能区选项卡的两种方法
自定义功能区示例:创建用于工作表导航的动态组合框
在《自定义功能区示例:创建用于工作表导航的下拉列表》中,我们在Excel功能区中添加一个自定义的选项卡,然后再该选项卡中添加带有下拉列表的一个自定义组,用于从下拉列表中选择工作表,从而快速导航到该工作表,这对于工作簿中有大量工作表且要快速找到相应的工作表的用户来说,非常有用。
fanjy
2023/11/02
5020
自定义功能区示例:创建用于工作表导航的动态组合框
VBA专题10-14:使用VBA操控Excel界面之在功能区中添加自定义库控件
在自定义功能区时,我们可以插入图像到自定义库中,图像文件的类型可以是ico、bmp、png、jpg和tif。
fanjy
2021/03/12
3.3K0
VBA专题10-19:使用VBA操控Excel界面之在功能区中添加不同类型的自定义控件
本文是前面一系列文章的综合,前面每篇文章讲解如何在功能区中添加一类自定义控件,本文讲解如何将在功能区中同时添加这些控件。
fanjy
2021/03/12
2K0
VBA专题10-9:使用VBA操控Excel界面之在功能区中添加自定义按钮控件
下面的一系列文章将重点讲解如何在功能区中添加不同类型的自定义控件,它们与最底层的自定义命令相关。这里的自定义命令是指程序员自已编写的VBA过程。
fanjy
2021/01/20
5.5K0
VBA专题10-9:使用VBA操控Excel界面之在功能区中添加自定义按钮控件
自定义功能区示例:自定义文件菜单、上下文菜单、功能区选项卡
在《自定义功能区示例:创建用于工作表导航的下拉列表》、《自定义功能区示例:创建用于工作表导航的动态组合框》中,我们在Excel功能区中添加一个自定义的选项卡,然后再该选项卡中添加带有下拉列表或组合框的一个自定义组,可用于从下拉列表中选择工作表,从而快速导航到该工作表,这对于工作簿中有大量工作表且要快速找到相应的工作表的用户来说,非常有用。
fanjy
2023/11/23
4290
自定义功能区示例:自定义文件菜单、上下文菜单、功能区选项卡
VBA实战技巧20:选取不同工作表中不同单元格区域时禁止用户执行复制剪切粘贴操作
在《VBA实战技巧19:根据用户在工作表中的选择来隐藏/显示功能区中的剪贴板组》中,我们讲解了根据用户在工作表中的选择来决定隐藏或者显示功能区选项卡中的特定组的技术。在这里就要派上用场了。
fanjy
2021/03/12
2.4K0
VBA专题10-5:使用VBA操控Excel界面之隐藏/取消隐藏及最小化功能区
可以重命名和隐藏内置选项卡和内置组,改变其在功能区中的顺序。然而,不能重命名和隐藏内置控件,修改内置控件的图标,修改功能区内置组中内置控件的顺序。
fanjy
2020/08/17
3.7K0
VBA专题10-17:使用VBA操控Excel界面之在功能区中添加自定义编辑框控件
1.使用编辑器打开Excel工作簿文件,编辑其XML文件,添加想要的功能区界面元素。
fanjy
2021/03/12
1.2K0
VBA专题10-8:使用VBA操控Excel界面之在功能区中添加内置控件
4. 在CustomUI Editor中,单击“插入”并选择“Office 2007 Custom UI Part”。之所以选择这个选项,是使工作簿与Excel 2007及以后的版本兼容。
fanjy
2020/11/09
7.1K0
VBA专题10-8:使用VBA操控Excel界面之在功能区中添加内置控件
自定义功能区示例:创建用于工作表导航的下拉列表
我们可以自定义功能区,在上面设置我们想要的功能,从而方便我们对工作表或工作簿的操作。本文的示例如下图1所示,在功能区中添加一个自定义的选项卡,然后再该选项卡中添加带有下拉列表的一个自定义组,用于从下拉列表中选择工作表,从而快速导航到该工作表,这对于工作簿中有大量工作表且要快速找到相应的工作表的用户来说,非常有用。
fanjy
2023/10/31
5040
自定义功能区示例:创建用于工作表导航的下拉列表
VBA专题10-18:使用VBA操控Excel界面之在功能区中添加自定义菜单控件
这是本系列文章讲解的最后一种在功能区中添加的自定义控件类型,也是用于组织多个命令的一种非常有用的控件——菜单控件。
fanjy
2021/03/12
1.7K0
VBA专题10-13:使用VBA操控Excel界面之在功能区中添加自定义下拉控件
在上篇文章《VBA专题10-12:使用VBA操控Excel界面之在功能区中添加自定义组合框控件》中,我们详细介绍了如何在自定义功能区中添加组合框。使用组合框,我们不仅可以从中选取列表项,还可以在其中输入文本。然而,本文介绍的下拉控件仅允许用户从控件下拉项中进行选择。
fanjy
2021/03/12
2.5K0
VBA专题10-11:使用VBA操控Excel界面之在功能区中添加自定义拆分按钮控件
拆分按钮控件是一个含有单击按钮和下拉按钮列表的组合控件。用户可以选择单击按钮,或者从下拉列表中选择单击其中一个按钮来执行相应的命令。
fanjy
2021/02/05
1.9K0
推荐阅读
VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡
3.6K0
VBA专题10-24:使用VBA操控Excel界面之单元格上下文菜单(Excel 2010及以后的版本)
1.6K0
VBA专题10-25:使用VBA操控Excel界面之一个示例程序
2.5K0
VBA实战技巧19:根据用户在工作表中的选择来隐藏/显示功能区中的剪贴板组
4.5K0
VBA专题10-23:使用VBA操控Excel界面之添加动态菜单
6.5K0
VBA专题10-15:使用VBA操控Excel界面之在功能区中添加自定义标签控件
2.5K0
VBA专题10-6:使用VBA操控Excel界面之执行命令以及激活功能区选项卡的两种方法
4.1K0
自定义功能区示例:创建用于工作表导航的动态组合框
5020
VBA专题10-14:使用VBA操控Excel界面之在功能区中添加自定义库控件
3.3K0
VBA专题10-19:使用VBA操控Excel界面之在功能区中添加不同类型的自定义控件
2K0
VBA专题10-9:使用VBA操控Excel界面之在功能区中添加自定义按钮控件
5.5K0
自定义功能区示例:自定义文件菜单、上下文菜单、功能区选项卡
4290
VBA实战技巧20:选取不同工作表中不同单元格区域时禁止用户执行复制剪切粘贴操作
2.4K0
VBA专题10-5:使用VBA操控Excel界面之隐藏/取消隐藏及最小化功能区
3.7K0
VBA专题10-17:使用VBA操控Excel界面之在功能区中添加自定义编辑框控件
1.2K0
VBA专题10-8:使用VBA操控Excel界面之在功能区中添加内置控件
7.1K0
自定义功能区示例:创建用于工作表导航的下拉列表
5040
VBA专题10-18:使用VBA操控Excel界面之在功能区中添加自定义菜单控件
1.7K0
VBA专题10-13:使用VBA操控Excel界面之在功能区中添加自定义下拉控件
2.5K0
VBA专题10-11:使用VBA操控Excel界面之在功能区中添加自定义拆分按钮控件
1.9K0
相关推荐
VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验