在VBA中排序不同长度的字符串,以便最长时间不是最后

时间:2017-04-07 20:16:28

标签: excel vba excel-vba sorting

我正在尝试使用VBA对房间号码列表进行排序。但是,有些房间的数字末尾有“A”或“B”,表示套房式居住。我想对房间列表进行排序,以便具有A或B的那些未排序到列表的末尾,因为它们是更长的字符串。我在VBA中尝试了排序功能,如此

StartRange.Sort Key1:=SortRange, Order1:xlAscending

其中StartRange和SortRange是其他地方定义的Range对象。该函数正确地对数据进行排序,但我得到的结果如

411
418
422
432
415A
415B
428B

而我希望将它们排序为:

411
415A
415B
418
422
428B
432

我考虑过尝试将房间排序为文本,只计算前三个字符,然后根据最后一个字母对As和Bs的每个单独的块进行排序,但这更复杂了三件事:

  1. 部分房间是四位数(例如1195,1045等)。这些房间都没有A或B的问题。
  2. 部分房间以“W”或“E”开头,具体取决于它们是在建筑物的西半部还是东半部。其中一些房间确实有A或B后缀,但它们按照我希望它们排序的方式在列表中正确排序(例如W134,W135A,W135B,W136等)。
  3. 并非所有会议室都在Excel中的同一个工作表中。我正在从几个不同建筑物的房间主列表中工作,每个工作表按建筑物排序。
  4. 单元格的格式既是“通用”又是“文本”,两者都有相同的结果。在解决此问题时,将非常感谢可以提供的任何帮助。先感谢您!

2 个答案:

答案 0 :(得分:1)

以下是对此page

的修改
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会在字母数字字段之前对数字字段进行排序。通过用虚拟字段替换每个数字,其中数字前缀为任意字符串' ZZZZZ'您强制excel将所有字段视为字母数字。然后,您对这些转换后的字段进行排序,然后删除' ZZZZZ'的每个序列。

希望你没有以5 Z结尾的房间#。

答案 1 :(得分:0)

您可以插入新列并获取其中的数值,然后对新列执行排序。

假设您的数据位于A列中,然后使用列(2)插入一列右侧的A列。插入并在新列中放置以下公式

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

其中lr是最后一行并且可以计算。 现在对新列B进行排序,最后将其删除。

看看这是否可以使用。