在excel中进行非常规sorting

我有这样的列表:

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 

我需要它按以下方式sorting:

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

传统的sorting可以这样完成:

 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...,但是这不是我所需要的

拆分列( 使用文本到列 ),以便先按字母sorting,然后按数字列sorting。 然后重新组合你的列。

如果这是一个反复出现的情况,你可以移动到一个macros,所以你将有更多的控制格式。

在VBA中的标准分拣机不会给你从内部访问,但我的可编程LAselect加载项。 它允许你截取logging,如果你真的想要一个可重用的工具,也可以使用正则expression式。

像“[0-9] + $”这样的正则expression式会返回logging末尾的任意位数,LAselect会按照想要的方式对它们进行sorting。 如果前面的expression式返回相同的数字,则使用“^ [A-Za-z] *”来获取文本部分。

您可以在互联网上的任何地方findLASelect。 有关如何在VBA中打开正则expression式以及如何自动添加正则expression式的说明,请参见www.liquorice-allsorts.com上的最新版本,或者访问http://www.regular-expressions.info/vb.html

这是我做的。 我首先做了一个小string操作。 而不是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