VBA运行时错误13:删除合并单元格数据触发报错求助
问题分析与解决
Run-time error '13'(类型不匹配)的原因是:当你删除多个单元格时,Target会变成一个多单元格区域,此时Target.Value返回的是数组而非单个值,Select Case无法处理数组,就会触发类型不匹配错误。另外你的代码存在重复判断,可以优化。
修改后的代码
Private Sub Worksheet_Change(ByVal Target As Range) ' 禁止事件触发,避免隐藏行时重复触发本过程 Application.EnableEvents = False ' 处理多单元格操作,直接退出(只关注单个单元格的修改) If Target.Cells.Count > 1 Then GoTo Cleanup Dim intersectU8 As Range Dim intersectG22 As Range ' 获取目标区域与监控区域的交集 Set intersectU8 = Application.Intersect(Target, Range("U8:Y8")) Set intersectG22 = Application.Intersect(Target, Range("G22:K22")) ' 处理U8:Y8区域的修改 If Not intersectU8 Is Nothing Then Select Case Target.Value Case "Owner" Rows("11:11").EntireRow.Hidden = True Rows("18:18").EntireRow.Hidden = False Case "Renter" Rows("11:11").EntireRow.Hidden = False Rows("18:18").EntireRow.Hidden = True Case "" Rows("11:11").EntireRow.Hidden = False Rows("18:18").EntireRow.Hidden = False End Select End If ' 处理G22:K22区域的修改 If Not intersectG22 Is Nothing Then Select Case Target.Value Case "Mail" Rows("23:23").EntireRow.Hidden = True Case "E-Billing", "" Rows("23:23").EntireRow.Hidden = False End Select End If Cleanup: ' 恢复事件触发 Application.EnableEvents = True End Sub
关键修改说明
- 多单元格判断:增加
If Target.Cells.Count > 1 Then GoTo Cleanup,删除多个单元格时直接跳过后续逻辑,避免类型不匹配。 - 合并重复判断:将原代码中两次判断
U8:Y8的逻辑合并,减少冗余代码。 - 优化交集判断:直接用
Application.Intersect(Target, 监控区域),无需额外转换Target.Address,更高效可靠。 - 事件控制:添加
Application.EnableEvents = False,防止隐藏行操作触发Worksheet_Change事件,造成循环调用;最后必须恢复事件触发,否则后续其他事件也会失效。 - 简化Case分支:将
""和E-Billing合并为同一个分支,精简代码。
内容的提问来源于stack exchange,提问作者Kate Black
相关产品推荐
相关产品推荐

