You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:53:22