VBA报错Type mismatch:Worksheet_Change事件类型不匹配问题求助
解决VBA类型不匹配错误的方案
错误原因分析
你遇到的Type mismatch错误主要来自两个场景:
- 当一次性修改多个单元格时,
Target是多单元格区域,Target.Value会返回数组,直接和字符串"N.I.O"比较会触发类型不匹配 - 如果目标单元格包含错误值(比如
#N/A、#VALUE!),直接读取Value也会导致类型错误
修正后的代码
Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim i As Long Dim cell As Range Dim desviacionesWs As Worksheet ' 关闭屏幕刷新和事件触发,避免卡顿和递归 Application.ScreenUpdating = False Application.EnableEvents = False ' 提前定义目标工作表,避免Activate操作 Set desviacionesWs = ThisWorkbook.Worksheets("Desviaciones UB") ' 只处理D8:D312范围内的单元格,循环遍历每个修改的单元格 For Each cell In Intersect(Target, Me.Range("D8:D312")) ' 先判断单元格是否为错误值,再转字符串比较 If Not IsError(cell.Value) Then If CStr(cell.Value) = "N.I.O" Then With desviacionesWs i = .Cells(.Rows.Count, 2).End(xlUp).Row ' 复制上一行的格式和公式 .Rows(i).Copy .Rows(i + 1).PasteSpecial Paste:=xlPasteFormats .Rows(i + 1).PasteSpecial Paste:=xlPasteFormulas End With Application.CutCopyMode = False End If End If Next cell ' 恢复屏幕刷新和事件触发 Application.EnableEvents = True Application.ScreenUpdating = True End Sub
关键优化点
- 新增
For Each cell In Intersect(...)循环,确保逐个处理修改的单元格,兼容多单元格修改场景 - 加入
IsError(cell.Value)判断,避免错误值导致的类型不匹配 - 直接引用目标工作表(
desviacionesWs),替代Activate操作,提升代码稳定性和效率 - 开启
Application.EnableEvents = False,防止新增行时触发Worksheet_Change递归事件
内容的提问来源于stack exchange,提问作者Edu1243
相关产品推荐
相关产品推荐

