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

Excel VBA:Worksheet_Change双单元格多条件隐藏行报Else without IF错

修正Worksheet_Change事件的VBA逻辑(解决"Else without IF"错误及功能需求)

错误原因分析

你的代码报错"Else without IF",核心问题是第一个Select Case Target块没有用End Select闭合,导致后续的ElseIf无法匹配到对应的If结构。除此之外还有几个逻辑缺陷:

  • counter变量没有在每次处理前重置,会导致累计计数错误
  • 没有实现"一个选择值、另一个为空"的互斥条件判断
  • 多余的End Function语句(这是Sub过程,不是Function)

修正后的完整代码

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim counter As Long
    Dim iRange As Range
    Dim AreaToHide As Range
    
    ' 先取消所有13-22行的隐藏状态
    Rows("13:22").Hidden = False
    
    ' 刷新计算
    Worksheets("Home").Calculate
    
    ' 处理产品下拉框(D13):仅当C13为空时执行
    If Target.Address(True, True) = "$D$13" Then
        If Target.Value <> "" And Range("$C$13").Value = "" Then
            Select Case Target.Value
                Case "Product 1", "Product 2", "Product 3"
                    counter = 0 ' 重置计数器
                    ' 统计E列13-22行非空行数
                    With ActiveSheet.Range("E13:E22")
                        For Each iRange In .Rows
                            If Application.CountA(iRange) > 0 Then
                                counter = counter + 1
                            End If
                        Next
                    End With
                    ' 隐藏非空行之后的所有行
                    If counter < 10 Then ' 13-22共10行
                        Set AreaToHide = ActiveSheet.Rows(counter + 13 & ":22")
                        AreaToHide.Hidden = True
                    End If
            End Select
        End If
    
    ' 处理国家下拉框(C13):仅当D13为空时执行
    ElseIf Target.Address(True, True) = "$C$13" Then
        If Target.Value <> "" And Range("$D$13").Value = "" Then
            Select Case Target.Value
                Case "Country 1", "Country 2", "Country 3"
                    counter = 0 ' 重置计数器
                    ' 统计G列13-22行非空行数
                    With ActiveSheet.Range("G13:G22")
                        For Each iRange In .Rows
                            If Application.CountA(iRange) > 0 Then
                                counter = counter + 1
                            End If
                        Next
                    End With
                    ' 隐藏非空行之后的所有行
                    If counter < 10 Then
                        Set AreaToHide = ActiveSheet.Rows(counter + 13 & ":22")
                        AreaToHide.Hidden = True
                    End If
            End Select
        End If
    End If
End Sub

关键修改说明

  1. 修复语法错误:给第一个Select Case添加了End Select,解决"Else without IF"的报错
  2. 互斥条件判断:在处理每个下拉框时,增加了对另一个下拉框为空的检查,符合需求中"一个选择值、另一个为空"的逻辑
  3. 重置计数器:每次处理前将counter设为0,避免之前的计数残留导致错误的行隐藏位置
  4. 边界判断:增加If counter <10的判断,防止当所有行都非空时尝试隐藏不存在的行
  5. 清理冗余代码:移除了多余的End Function语句,因为这是Sub过程而非Function

内容的提问来源于stack exchange,提问作者Elliot Trofimowicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:25:08