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

Excel VBA:基于条件隐藏行,单元格为空时触发类型不匹配错误

Excel VBA 删除单元格内容触发类型不匹配错误的解决方法

错误根源

当你删除G17的内容时,单元格返回的Value是Empty(空值类型),而原代码里用Case Is = ""把Empty和空字符串做比较,数据类型不匹配,直接触发了运行时错误13。

修复后的代码

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 只处理G17单元格的变更
    If Not Application.Intersect(Range("G17"), Target) Is Nothing Then
        ' 把单元格值转成字符串,统一类型避免冲突
        Dim cellText As String
        cellText = CStr(Target.Value)
        
        Select Case cellText
            Case "Yes"
                Rows("21:27").EntireRow.Hidden = False
            Case Else ' 空值、其他任意内容都走这里
                Rows("21:27").EntireRow.Hidden = True
        End Select
    End If
End Sub

代码优化点

  • 删掉了多余的ActiveSheet.Activate:Change事件本身就在当前工作表触发,完全没必要重复激活。
  • 简化Intersect判断:直接用Target代替Range(Target.Address),写法更简洁高效。
  • 统一数据类型:用CStr()把单元格值转成字符串,不管是Empty还是文本都能正常比较。
  • 合并冗余判断:用Case Else覆盖所有非"Yes"的情况,包括空值,代码更简洁。

进阶优化(避免递归和批量修改错误)

如果担心批量修改单元格或者代码触发递归事件,可以加个事件开关和单元格数量判断:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    On Error GoTo ResetEvents ' 出错时强制恢复事件
    
    ' 只处理单个单元格且是G17的情况
    If Target.Cells.Count = 1 And Not Application.Intersect(Range("G17"), Target) Is Nothing Then
        Dim cellText As String
        cellText = CStr(Target.Value)
        
        ' 一行代码搞定判断,更高效
        Rows("21:27").EntireRow.Hidden = (cellText <> "Yes")
    End If

ResetEvents:
    Application.EnableEvents = True
End Sub

内容的提问来源于stack exchange,提问作者DJ LPM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:01:22