excel中的非常规排序

时间:2010-06-17 17:00:11

标签: excel vba

我有一个这样的清单:

G05
G03
F02
F06
G10
A03
A11
E10
E05
C11
C03
D03
A12
C12
F05
H03
C08
G02
D10
B12
C10
D11
C02
E11
E02
E03
H11
A08
D05
F04
A04
H07
D04
B07
F12
E04
B03
H05
C06
F08
C09
E08
G12
C04
B05
H09
A07
E09
C07
G07
G09
A06
D09
E07
E12
G04
A10
H02
G08
B06
B09
D06
F07
G06
A09
H06
D07
H04
H10
F10
B02
B10
F03
F11
D08
B11
B08
D12
H08
A05

我需要按以下方式排序:

A03, B03, C03....A04, B04, C04.....A11, B11, C11........

传统的排序可以这样做:

ActiveWorkbook.Worksheets("2871P1").Sort.SortFields.Add Key:=Range("D20:D99") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("2871P1").Sort
    .SetRange Range("D20:E99")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

然而,使用这种方法,我们将获得A01, A02, A03 etc...,,但这不是我需要的

3 个答案:

答案 0 :(得分:4)

拆分列(using Text to Columns),以便先按字母排序,然后按数字列排序。然后重新组合你的专栏。

答案 1 :(得分:1)

如果这是一种反复出现的情况,您可以将排序移动到宏,这样您就可以更好地控制格式。

VBA中的标准分拣机不允许您从内部访问,但我的可编程LAselect插件可以访问。它允许您截取记录,如果您真的需要可重用的工具,还可以使用正则表达式。

像“[0-9] + $”这样的正则表达式会从记录的末尾返回任意数量的数字,而LAselect会按照想要的方式对它们进行排序。如果前一个表达式返回相等的数字,则使用“^ [A-Za-z] *”来获取文本部分。

您可以在互联网上的任何地方找到LASelect。有关如何在VBA中启用正则表达式并支持自动添加它们的说明仅在www.liquorice-allsorts.com上的最后一个版本中提供,或者请参阅http://www.regular-expressions.info/vb.html

答案 2 :(得分:0)

这就是我所做的。我先做了一点字符串操作。而不是A03,我将03A放在单元格中。然后我整理了整个事情。然后我把它放回A03

Dim replace_string As String
Dim replace_number As String

For i = 20 To 98
    replace_string = Mid(Cells(i, 4), 1, 1)
    replace_number = Mid(Cells(i, 4), 2, 2)
    Cells(i, 4) = replace_number + replace_string
Next i


ActiveWorkbook.Worksheets("2871P1").Sort.SortFields.Add Key:=Range("D20:D99") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("2871P1").Sort
    .SetRange Range("D20:E99")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

For i = 20 To 98
    replace_string = Mid(Cells(i, 4), 3, 1)
    replace_number = Mid(Cells(i, 4), 1, 2)
    Cells(i, 4) = replace_string + replace_number
Next i