VBA工作表Change事件代码功能正常,修改C3/E3时Excel崩溃求助
问题原因与解决方案
崩溃的核心原因是无限事件循环:修改C3触发Worksheet_Change事件后,代码修改E3会再次触发该事件;同理修改E3时修改C3也会触发事件,反复循环导致Excel资源耗尽崩溃。
修复后的代码
Private Sub Worksheet_Change(ByVal Target As Range) Dim SpotRate As Double Dim srcSheet As Worksheet ' 禁用事件,防止修改单元格时重复触发Change事件 Application.EnableEvents = False On Error GoTo Cleanup ' 错误处理,确保事件能恢复 Set srcSheet = ThisWorkbook.Worksheets("Input Data") SpotRate = srcSheet.Range("H2").Value If Target.Address = "$C$3" Then If Target.Value <> "" Then Range("E3").Value = Target.Value * SpotRate Else Range("E3").ClearContents End If ElseIf Target.Address = "$E$3" Then If Target.Value <> "" Then ' 增加判断避免除以0错误 If SpotRate <> 0 Then Range("C3").Value = Target.Value / SpotRate Else MsgBox "H2单元格的值不能为0" End If Else Range("C3").ClearContents End If End If Cleanup: ' 恢复事件触发,必须执行 Application.EnableEvents = True If Err.Number <> 0 Then MsgBox "发生错误:" & Err.Description End If End Sub
关键修改说明
- 禁用/恢复事件:通过
Application.EnableEvents = False在修改单元格前关闭事件触发,避免循环;操作完成后必须恢复为True,否则后续的单元格修改都不会触发Change事件。 - 错误处理:添加
On Error GoTo Cleanup确保即使代码出错,也能执行到恢复事件的步骤,防止事件被永久禁用。 - 除以0防护:增加
SpotRate <> 0的判断,避免H2为0时执行除法导致运行时错误。
内容的提问来源于stack exchange,提问作者user22168531
相关产品推荐
相关产品推荐

