Worksheet_Change宏引发Excel 1004错误并重启问题求助
Worksheet_Change宏1004错误分析与修复
核心错误原因
- 事件递归循环:在
Worksheet_Change事件中修改目标单元格值时,会再次触发该事件,形成无限递归,最终导致Excel资源耗尽,抛出1004错误甚至崩溃。 - 无效单元格范围:当L列第20行及以下无数据时,
lRow = Cells(Rows.Count,12).End(xlUp).Row会返回19,此时Range("L20:L" & lRow)变成L20:L19——这是一个反向的无效范围,直接触发1004错误。
修复后的完整代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim lRow As Long, calcValue As Variant ' 跳过多单元格批量修改的情况 If Target.Cells.CountLarge > 1 Then Exit Sub ' 确保范围起始行不低于20,避免生成无效区间 lRow = Cells(Rows.Count, 12).End(xlUp).Row If lRow < 20 Then lRow = 20 ' 检查目标单元格是否在指定范围内 If Not Intersect(Target, Range("L20:L" & lRow)) Is Nothing Then ' 仅处理数值输入 If IsNumeric(Target.Value) Then ' 关闭事件触发,防止递归 Application.EnableEvents = False ' 计算求和结果 calcValue = Target.Value + Range("A1").Value + Range("B1").Value Target.Value = calcValue ' 恢复事件触发 Application.EnableEvents = True End If End If End Sub
关键修复说明
- 阻断递归触发:修改单元格前关闭
Application.EnableEvents,避免修改操作再次触发Worksheet_Change事件,操作完成后必须恢复该设置,否则后续所有工作表事件都会失效。 - 保证范围有效性:强制
lRow不小于20,确保生成的Range("L20:L" & lRow)始终是合法的单元格区间。 - 明确取值操作:调用
Range("A1").Value而非直接引用Range("A1"),避免隐式类型转换可能引发的异常。
内容的提问来源于stack exchange,提问作者k1dr0ck
相关产品推荐
相关产品推荐

