咨询Excel中Worksheet_Change事件被删除代码段的功能
关于Excel VBA中Worksheet_Change事件里Target.Dependents代码段的功能解析
问题背景
我用Excel管理轴承状态表格,包含8个左右工作表、800+轴承(数量还会增加),表格里有列记录状态最后变更日期。工作簿仪表盘配有ActiveX控件和用户表单可自动修改状态,同时需要实现手动修改G列下拉列表状态时,对应单元格自动更新日期。我修改了Worksheet_Change事件的VBA代码,删除了原代码中处理Target.Dependents的逻辑段,想咨询这段被删除代码的具体功能。
原代码
Private Sub Worksheet_Change(ByVal Target As Excel.Range) 'Updated by Extendoffice 2017/10/12 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列状态由公式联动更新时的日期同步,拆解来看:
Application.EnableEvents = False:临时关闭事件触发,避免后续修改单元格日期时再次触发Worksheet_Change事件,造成递归循环。Set xRg = Application.Intersect(Target.Dependents, Me.Range("G5:G80")):Target.Dependents指代所有公式中引用了当前修改单元格(Target)的单元格——比如你修改了A1,而G6的公式是=A1,那么G6就是A1的Dependents。- 用
Intersect筛选出这些依赖单元格中,同时属于G5:G80范围的部分,得到需要处理的G列单元格集合。
- 循环遍历
xRg中的每个单元格,将其右侧相邻单元格(即状态变更日期列)设置为当前日期。
简单来说:如果你的G列中有单元格是通过公式引用其他单元格来自动更新状态的,当被引用的源头单元格发生修改时,这段代码会自动把对应G列单元格的日期列更新为当天日期。而你修改后的代码只处理手动直接修改G列单元格的情况,不再覆盖G列由公式联动更新的场景。
内容的提问来源于stack exchange,提问作者Drew Killingley
相关产品推荐
相关产品推荐

