为何Excel VBA代码中设置的最后排序列D反而在F之后排序?
Excel VBA排序优先级问题解答
问题原因
Excel VBA的SortFields集合是按添加顺序的逆序执行排序优先级的:
- 先添加的字段是次要排序依据(最后生效,仅当前面的字段值相同时才会用到)
- 后添加的字段是主要排序依据(最先生效,优先按该字段排序)
你的代码里先添加了F列,再添加D列,实际排序逻辑是:
- 优先按D列升序排序
- D列值相同的行,再按F列升序排序
这就导致F列成了最后生效的排序依据,和你期望的“D列作为最后排序依据”正好相反。
修正代码
要让D列成为最后排序依据,只需调换SortFields.Add2的顺序,先添加D列(次要依据),再添加F列(主要依据):
Sub Sort_Priority() ' Sort_Priority Macro ActiveWorkbook.Worksheets("Reminders").Sort.SortFields.Clear ' 先添加次要排序依据D列 ActiveWorkbook.Worksheets("Reminders").Sort.SortFields.Add2 Key:=Range("D6:D138" _ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ' 后添加主要排序依据F列 ActiveWorkbook.Worksheets("Reminders").Sort.SortFields.Add2 Key:=Range("F6:F138" _ ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Reminders").Sort .SetRange Range("C6:J138") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("D6").Select End Sub
修正后排序逻辑变为:
- 优先按F列升序排序
- F列值相同的行,再按D列升序排序,此时D列就是最后生效的排序依据。
内容的提问来源于stack exchange,提问作者Artie Jones
相关产品推荐
相关产品推荐

