Excel VBA实现点击单个形状批量显示/隐藏多个形状
VBA实现点击形状批量切换其他形状可见性
原有代码逻辑拆解
你贴的可运行代码逻辑非常简单,逐行说明:
Public HIDE As Boolean:定义了一个全局布尔变量,布尔类型只有True/False两个值,全局变量的值不会在宏运行结束后清空,会保留上次运行的结果ActiveSheet.Shapes("july_2022").Visible = HIDE:将当前活动工作表中名为july_2022的形状可见性,设置为变量HIDE存储的状态- 后续
If判断块:检测设置完成后形状的可见状态,如果当前是隐藏(False),就把HIDE的值改为True,下次运行宏时形状就会显示;如果当前是显示(True),就把HIDE的值改为False,下次运行宏时形状就会隐藏,以此实现点击一次切换一次状态的效果。
原有代码的写法逻辑有点绕,而且只能控制单个形状,做批量控制时可以简化写法,可读性更高。
需求实现步骤
1. 实现点击shape1切换shape2、shape3可见性
- 第一步:手动设置初始状态。打开工作表的选择窗格(开始选项卡-查找和选择-选择窗格),点
shape 2、shape 3后面的眼睛图标把两个形状设为隐藏,符合默认隐藏的要求。 - 第二步:打开VBA编辑器(按
Alt+F11),插入新模块,把原有代码替换为以下内容:
' 全局变量存储显示状态,默认初始值为False(对应隐藏状态) Public isVisible As Boolean Sub ToggleShapes() ' 每次点击先翻转状态:隐藏变显示,显示变隐藏 isVisible = Not isVisible ' 同时设置两个目标形状的可见性 ActiveSheet.Shapes("shape 2").Visible = isVisible ActiveSheet.Shapes("shape 3").Visible = isVisible End Sub
- 第三步:回到工作表界面,右键点击
shape 1,选择「指定宏」,选中ToggleShapes后确定,之后点击shape1就能同时切换两个形状的显示/隐藏状态。
2. 扩展为批量切换多个形状(含多月份形状)
如果需要同时控制july_2022、august_2022等更多形状,不需要逐行写重复代码,用数组存储所有要控制的形状名,循环批量设置即可,代码如下:
Public isMonthVisible As Boolean Sub ToggleMonthShapes() Dim shapeList As Variant Dim idx As Long ' 翻转当前状态 isMonthVisible = Not isMonthVisible ' 所有需要控制的形状名都写在下面的括号里,用英文双引号包裹,逗号分隔 shapeList = Array("july_2022", "august_2022", "september_2022") ' 循环遍历所有形状,统一设置可见性 For idx = LBound(shapeList) To UBound(shapeList) ActiveSheet.Shapes(shapeList(idx)).Visible = isMonthVisible Next idx End Sub
后续需要新增控制的形状,直接在Array()的参数里加对应形状名即可,不需要修改其他逻辑。
注意事项
- 形状名必须和选择窗格里显示的名称完全一致,包含空格、大小写都要匹配,否则会运行报错,可以直接在选择窗格里双击形状名重命名,降低出错概率。
- 编辑完成后文件需要保存为
.xlsm(启用宏的工作簿)格式,否则宏代码会被清除,下次打开无法使用。 - 如果初始状态不符合预期,把所有要控制的形状手动设为隐藏,关闭文件重新打开即可恢复默认隐藏的初始状态。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

