我正在尝试使用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的每个单独的块进行排序,但这更复杂了三件事:
单元格的格式既是“通用”又是“文本”,两者都有相同的结果。在解决此问题时,将非常感谢可以提供的任何帮助。先感谢您!
答案 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进行排序,最后将其删除。
看看这是否可以使用。