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
相关产品推荐
相关产品推荐

