如何修改VBA代码实现多单元格控制行的隐藏与取消隐藏?
多组单元格控制对应行隐藏/显示的VBA实现
现有Worksheet_Change事件VBA代码仅能通过C13单元格的值控制第14行的隐藏/显示,需求修改代码实现多组对应控制:C13控制第14行、C19控制第20行、C29控制第30行等,即多个单元格的选择值分别对应控制多行的隐藏与取消隐藏。
原代码:
Private Sub Worksheet_Change Dim rng As Range ' Enter range to consider Set rng = Range("c13:c13") ' Run macro if a cell in the above range is changed If Not Intersect(Target, rng) Is Nothing Then ' If any cells in rng is "Yes", unhide rows If Application.WorksheetFunction.CountIf(rng, "Yes") > 0 Then Rows("14:14").EntireRow.Hidden = False Else Rows("14:14").EntireRow.Hidden = True End If End If End Sub
修改后的代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim controlCells As Variant Dim i As Integer ' 定义控制单元格与对应目标行的映射关系,可按需添加新组 controlCells = Array( _ Array("C13", 14), _ Array("C19", 20), _ Array("C29", 30) _ ' 示例:Array("C35", 36) 可继续追加更多控制组 ) ' 关闭事件触发,避免代码执行时循环触发Worksheet_Change Application.EnableEvents = False ' 遍历每一组控制规则 For i = LBound(controlCells) To UBound(controlCells) ' 判断修改的单元格是否属于当前控制组 If Not Intersect(Target, Me.Range(controlCells(i)(0))) Is Nothing Then ' 根据单元格值设置对应行的隐藏状态:值为Yes则显示,否则隐藏 Me.Rows(controlCells(i)(1)).EntireRow.Hidden = (UCase(Me.Range(controlCells(i)(0)).Value) <> "YES") End If Next i ' 恢复事件触发 Application.EnableEvents = True End Sub
代码关键点说明
- 灵活扩展:所有控制关系都放在
controlCells数组里,新增控制组只需按格式追加数组元素即可,不用修改核心逻辑 - 避免循环触发:添加
Application.EnableEvents开关,防止代码修改行状态时再次触发Worksheet_Change事件导致错误 - 大小写兼容:用
UCase把单元格值转成大写后比较,不管输入的是"yes"/"Yes"/"YES"都能正确识别 - 逻辑简化:直接通过判断表达式设置行的隐藏状态,替代原代码的If-Else分支,代码更简洁
内容的提问来源于stack exchange,提问作者Ricardo Jorge Neves Moreira
相关产品推荐
相关产品推荐

