VBA代码选择下拉框“-”时致文件崩溃,请求排查解决
问题原因及修复方案
你的代码崩溃的核心原因是无限事件循环:当你修改ActiveCell.Offset(0,1)的内容时,会再次触发Worksheet_Change事件,这个过程反复触发就会导致Excel无响应。选择“Yes”时虽然也会触发循环,但因为写入的是时间戳,两次写入内容一致时Excel会停止触发事件;而选择“-”时是清空单元格,每次清空都会触发新的Change事件,直接陷入死循环。
另外代码里用ActiveCell也有隐患,ActiveCell是当前选中的单元格,但触发Change事件的Target才是真正被修改的单元格,二者可能不一致。
修正后的代码
Private Sub Worksheet_Change(ByVal Target As Range) ' 禁用事件触发,避免循环 Application.EnableEvents = False On Error GoTo Handler ' 只处理单个单元格的修改,避免批量操作出错 If Target.Cells.Count = 1 Then If Target.Value = "Yes" Then Target.Offset(0, 1) = Format(Now(), "dd-mm-yyyy hh:mm") ElseIf Target.Value = "-" Then Target.Offset(0, 1) = "" End If End If Handler: ' 无论是否出错,都恢复事件触发 Application.EnableEvents = True End Sub
关键修改点:
- 新增
Application.EnableEvents = False,在修改单元格前禁用事件,防止循环触发 - 错误处理块中强制恢复
Application.EnableEvents = True,避免出错后事件一直处于禁用状态 - 用
Target替代ActiveCell,确保操作的是触发事件的目标单元格 - 增加
Target.Cells.Count = 1判断,避免批量修改单元格时出现异常
内容的提问来源于stack exchange,提问作者M_Naipaul
相关产品推荐
相关产品推荐

