求Excel VBA脚本补充:自动添加作者及修改日期后实现列排序
解决方法
直接在现有代码中添加排序逻辑即可,需要注意禁用事件触发避免循环,同时准确定位需要排序的数据区域。以下是修改后的完整代码:
Private Sub Worksheet_Change(ByVal Target As Range) ' declare constants and variables Const owner_col As String = "I" Const date_col As String = "J" Dim row As Double Dim owner_addr As Range Dim date_addr As Range Dim lastRow As Long Dim sortRange As Range ' initialise row = Target.row Set owner_addr = Range(owner_col & row) Set date_addr = Range(date_col & row) ' check that the update is not to the fields you want to update to avoid infinite loop If Target.Address <> owner_addr.Address And Target.Address <> date_addr.Address Then ' 禁用事件,防止排序触发Change事件导致循环 Application.EnableEvents = False ' set values owner_addr.Value = Environ("username") date_addr.Value = Now() ' 确定排序数据范围:假设表头在第1行,数据从第2行开始到最后一行 lastRow = Me.Cells(Me.Rows.Count, "A").End(xlUp).row ' 用A列判断最后一行,可根据实际调整 Set sortRange = Me.Range("A1:J" & lastRow) ' 包含表头的完整数据区域 ' 执行排序:D列升序,E列降序 With sortRange.Sort .SortFields.Clear .SortFields.Add Key:=Me.Range("D1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Me.Range("E1"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal .SetRange sortRange .Header = xlYes ' 如果没有表头,改为xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ' 恢复事件触发 Application.EnableEvents = True End If ' free up the memory Set owner_addr = Nothing Set date_addr = Nothing Set sortRange = Nothing End Sub
关键说明:
- 禁用事件:排序操作会触发
Worksheet_Change事件,必须先执行Application.EnableEvents = False,否则会陷入无限循环,操作完成后记得恢复。 - 数据范围定位:通过
lastRow获取数据的最后一行,确保排序包含所有有效数据;如果你的表头不在第1行,或者数据起始列不是A,需要对应调整sortRange的范围。 - 排序规则:
SortFields.Add分别添加D列(升序)和E列(降序)的排序条件,.Header = xlYes表示第一行是表头,不需要参与排序;如果没有表头,改为xlNo。
内容的提问来源于stack exchange,提问作者Jague003
相关产品推荐
相关产品推荐

