Excel Worksheet_Change事件中移除的VBA代码作用及影响问询
问题说明
我在表格里用一列跟踪800+个轴承的状态(分布在8个工作表,数量还会持续增加),对应列记录状态最后变更的日期。工作簿的仪表盘有多个ActiveX控件和用户表单可自动修改状态,但我希望手动修改下拉列表状态时,对应单元格日期能自动更新。
我先修改了一段VBA代码并生效,之后又调整代码,实现了根据状态值更新该行不同单元格日期的功能,但移除了一段代码,不清楚这段代码的作用,担心后续会出问题。
移除的代码片段
Application.EnableEvents = False Set xRg = Application.Intersect(Target.Dependents, Me.Range("G5:G80")) If (Not xRg Is Nothing) Then For Each xCell In xRg xCell.Offset(0, 1) = Date Next End If Application.EnableEvents = True
此前使用的原代码
Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim xRg As Range, xCell As Range On Error Resume Next If (Target.Count = 1) Then If (Not Application.Intersect(Target, Me.Range("G5:G80")) Is Nothing) Then _ Target.Offset(0, 1) = Date Application.EnableEvents = False Set xRg = Application.Intersect(Target.Dependents, Me.Range("G5:G80")) If (Not xRg Is Nothing) Then For Each xCell In xRg xCell.Offset(0, 1) = Date Next End If Application.EnableEvents = True End If End Sub
修改后的代码
Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim xRg As Range, xCell As Range Dim UpperIndex As Integer Dim LowerIndex As Integer Dim Rows As Integer Set tbl = ThisWorkbook.Worksheets("Route 1").ListObjects("Route_1_Table") Rows = tbl.Range.Rows.Count UpperIndex = 5 LowerIndex = Rows - 3 On Error Resume Next If (Target.Count = 1) Then If (Not Application.Intersect(Target, Me.Range("G" & UpperIndex & ":G" & LowerIndex)) Is Nothing) Then _ Target.Offset(0, 1) = Date If Target.Value = "Good" Then _ Target.Offset(0, 5) = Date If Target.Value = "Pending Baseline" Then _ Target.Offset(0, 4) = Date End If End Sub
移除代码的作用及影响分析
- 核心作用:这段代码是处理间接修改G列状态单元格的场景——当你修改了某个单元格,而这个单元格是G5:G80范围内单元格的引用依赖项(比如G列单元格用公式引用了其他单元格的值),此时会自动将这些G列单元格对应的日期列(H列)更新为当前日期。
- 适用场景:如果你的G列状态单元格是通过公式计算得到的(而非手动直接输入或控件修改),比如G6单元格公式是
=I6,那么当你修改I6的值时,这段代码会触发G6对应的H6更新日期。 - 移除后的影响:
- 如果你的G列所有状态都是手动直接输入或通过ActiveX控件/用户表单直接赋值,没有用公式引用其他单元格,那这段代码移除后不会有任何问题。
- 但如果存在G列单元格依赖其他单元格计算的情况,那么修改依赖单元格时,对应的日期列将不会自动更新,需要手动维护日期,或者重新添加这段逻辑。
内容的提问来源于stack exchange,提问作者Drew Killingley
相关产品推荐
相关产品推荐

