S列输入Done自动填日期用户名,插入/删行后Worksheet_Change报错误13
解决Worksheet_Change宏插入/删除行触发错误13的问题
错误13(类型不匹配)的根源是:插入或删除行时,Target会指向多个单元格(比如整行),此时Target.Value返回的是数组,无法直接和字符串"Done"做比较。以下是修正后的代码:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim cell As Range Dim intersectRange As Range ' 禁用事件防止循环触发 Application.EnableEvents = False On Error GoTo Cleanup ' 出错时强制恢复事件设置 ' 仅锁定S列的受影响单元格 Set intersectRange = Intersect(Target, Me.Range("S:S")) If Not intersectRange Is Nothing Then ' 逐个处理每个受影响的单元格 For Each cell In intersectRange If cell.Value = "Done" Then cell.Offset(0, 7).Value = Date cell.Offset(0, 8).Value = Environ("username") Else cell.Offset(0, 7).ClearContents cell.Offset(0, 8).ClearContents End If Next cell End If Cleanup: ' 恢复事件设置,避免后续宏失效 Application.EnableEvents = True If Err.Number <> 0 Then MsgBox "错误: " & Err.Description, vbExclamation End If End Sub
核心修改说明:
- 遍历单个单元格:不再直接对多单元格的
Target做值判断,改为遍历Intersect返回的每个单元格,规避数组与字符串的类型不匹配问题。 - 事件控制:修改单元格内容会再次触发
Worksheet_Change,通过Application.EnableEvents临时禁用事件,防止循环触发,最后必须恢复。 - 错误兜底:添加错误跳转逻辑,确保即使代码出错,事件设置也能正常恢复,避免后续宏无法触发。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

