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
关键修改说明
- 修复语法错误:给第一个
Select Case添加了End Select,解决"Else without IF"的报错 - 互斥条件判断:在处理每个下拉框时,增加了对另一个下拉框为空的检查,符合需求中"一个选择值、另一个为空"的逻辑
- 重置计数器:每次处理前将
counter设为0,避免之前的计数残留导致错误的行隐藏位置 - 边界判断:增加
If counter <10的判断,防止当所有行都非空时尝试隐藏不存在的行 - 清理冗余代码:移除了多余的
End Function语句,因为这是Sub过程而非Function
内容的提问来源于stack exchange,提问作者Elliot Trofimowicz
相关产品推荐
相关产品推荐

