Excel Worksheet_Change事件未触发:编辑单元格时宏不运行求助
问题根源及解决方案
核心原因:事件过程存放位置错误
你把Worksheet_Change这个工作表级事件放在了ThisWorkbook模块里,这是错误的:
Worksheet_Change属于单个工作表的事件,必须存放在对应工作表的代码模块(比如Sheet1、Sheet2这类模块)中才会触发。ThisWorkbook模块仅支持工作簿级事件,比如Workbook_SheetChange(监听所有工作表的变更),而非单个工作表的Worksheet_Change。
额外代码逻辑问题(即使位置正确也会失效)
你的代码还有几处逻辑错误,即使放到正确模块也无法正常工作:
If Target = Selection Then:这个判断完全多余,且当Target是多个单元格时会触发类型不匹配错误,直接删除即可。If Range("F" & ThisRow) Is Nothing Then:Range对象只要行号有效就永远不会是Nothing,这个判断永远为假,无法实现“新增行时F列填创建日期”的需求。
正确实现方案
方案1:单个工作表生效(放在对应工作表模块)
如果只需要某一个工作表生效,右键工作表标签→点击「查看代码」,打开该工作表的代码模块,粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range) ' 禁用事件避免循环触发 Application.EnableEvents = False ' 处理A-D列编辑时更新E列(修改日期) If Not Intersect(Target, Me.Range("A:D")) Is Nothing Then Dim rng As Range For Each rng In Intersect(Target, Me.Range("A:D")) Me.Range("E" & rng.Row) = Date Next rng End If ' 处理新增行时更新F列(创建日期) ' 判断是否是整行插入且F列为空 If Target.EntireRow.Cells.Count = Target.Cells.Count And Me.Range("F" & Target.Row) = "" Then Me.Range("F" & Target.Row) = Date End If ' 恢复事件 Application.EnableEvents = True End Sub
方案2:所有工作表生效(放在ThisWorkbook模块)
如果需要工作簿中所有工作表都生效,使用工作簿级的Workbook_SheetChange事件,打开ThisWorkbook模块粘贴以下代码:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Application.EnableEvents = False ' 处理A-D列编辑时更新E列 If Not Intersect(Target, Sh.Range("A:D")) Is Nothing Then Dim rng As Range For Each rng In Intersect(Target, Sh.Range("A:D")) Sh.Range("E" & rng.Row) = Date Next rng End If ' 处理新增行时更新F列 If Target.EntireRow.Cells.Count = Target.Cells.Count And Sh.Range("F" & Target.Row) = "" Then Sh.Range("F" & Target.Row) = Date End If Application.EnableEvents = True End Sub
注意事项
- 必须恢复
Application.EnableEvents = True,否则后续所有事件都会被禁用。 - 新增行的判断基于“整行选中且F列为空”,可以覆盖大部分手动插入行的场景。
内容的提问来源于stack exchange,提问作者ETL
相关产品推荐
相关产品推荐

