在VBA中sorting不同的长度string,使得最长不是最后的

我正在尝试使用VBA对房间号码进行sorting。 但是,一些房间的数字末尾有一个“A”或“B”来表示套房式的生活。 我想对房间列表进行sorting,以便带有A或B的列表不会sorting到列表的末尾,因为它们是较长的string。 我尝试在VBA中的sortingfunction像这样

StartRange.Sort Key1:=SortRange, Order1:xlAscending 

StartRange和SortRange是别处定义的Range对象。 该函数正确sorting数据,但我得到的结果如

 411 418 422 432 415A 415B 428B 

而我希望他们被sorting为:

 411 415A 415B 418 422 428B 432 

我考虑试图把房间分类为文本,只计算前三个字符,然后根据最后一个字母对每个As和Bs的块进行sorting,但是这样会更复杂三点:

  1. 有些房间是四位数(例如1195,1045等)。 这些房间都没有与A或B的问题。
  2. 有些房间的前面是“W”或“E”,这取决于它们位于build筑物的西部还是东部。 其中一些房间确实有A或B后缀,但是按照我希望对它们进行分类的方式(例如W134,W135A,W135B,W136等)将它们正确地sorting在列表中。
  3. 不是所有的房间都在Excel中的同一张纸上。 我正在从几个不同的build筑物的房间主清单工作,每个工作表是按build筑物sorting的。

单元格的格式既是“普通”又是“文本”,都有相同的结果。 任何可以提供的帮助将非常感谢解决这个问题。 先谢谢你!

以下是本页面内容的改编

 Sub Sort_Special(StartRange As Range, SortRange As Range) Dim i As Long With SortRange For i = 0 To 9 .Replace What:=i, Replacement:="ZZZZZ" & i, LookAt:=xlPart, MatchCase:=False Next i End With StartRange.Sort Key1:=SortRange, Order1:=xlAscending, Header:=xlNo With SortRange For i = 0 To 9 .Replace What:="ZZZZZ", Replacement:="", LookAt:=xlPart, MatchCase:=False Next i End With End Sub 

Excel将数字字段sorting在字母数字字段之前。 通过用一个虚拟字段replace每个数字,其中数字前缀为任意string“ZZZZZ”,您迫使excel将所有字段视为字母数字。 然后,您可以对这些转换的字段进行sorting,然后删除每个“ZZZZZ”序列。

希望你没有房间#5 Z结束。

您可以插入一个新的列,并获取数值,并在新列上进行sorting。

假设你的数据在列A中,然后在列A右侧插入列(2)。插入并在新列中放置下列公式

 Range("B2:B" & lr).Formula = "=IF(ISERROR(RIGHT(A2,1)*1),LEFT(A2,LEN(A2)-1)*1,A2)" 

lr是最后一行,可以计算。 现在在新列B上sorting,最后删除它。

看看这是你可以使用的东西。