使用自定义顺序和包含逗号的值对Excel VBA排序进行编码

mu0hgdu0  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(112)

在VBA中,Excel允许使用CustomOrder参数对值进行排序,以选择项的排序顺序。不幸的是,项的顺序由逗号分隔,并且我的一个排序项包含逗号。例如,我想按第二列中的类别对第一列中的数据进行排序。“Air,Land,or Sea”类别包含逗号。

Data1     Aerospace
Data2     Cyberspace
Data3     Cyberspace
Data4     Air, Land, or Sea
Data5     Aerospace
Data6     Air, Land, or Sea
Data7     Cyberspace

如果录制VBA宏,则创建的代码如下所示:

MyWorksheet.Sort.SortFields.Add Key:=Range( _
    "B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _
    CustomOrder:= "Cyberspace,Air,Land,or Sea,Aerospace", _
    DataOption:=xlSortNormal  
MyWorksheet.Sort.Apply

因此,自定义排序顺序应该是“Cyberspace”,然后是“Air,Land,or Sea”,然后是“Aerospace”。然而,由于逗号的存在,第二个类别被视为三个类别。具有“Air,Land,or Sea”的行被排序到底部,因为Excel没有找到与它们匹配的自定义排序。是否有方法让CustomOrder处理包含嵌入逗号的类别?
我试着在类别周围加上双引号,并尝试用分号替换分隔符逗号(希望Excel能接受分号而不是逗号)。

bfnvny8b

bfnvny8b1#

好像少了Apply,可以添加吗

MyWorksheet.Sort.Apply

你的定制订单和我的样品一样。

编辑根据OP更新的问题进行更新

将宏编辑为以下内容-使用OrderCustom参数的数组。

Dim oWorksheet As Worksheet
Set oWorksheet = ActiveWorkbook.Worksheets("Sheet1")
Dim oRangeSort As Range
Dim oRangeKey As Range

' one range that includes all colums do sort
Set oRangeSort = oWorksheet.Range("A1:B9")
' start of column with keys to sort
Set oRangeKey = oWorksheet.Range("B1")

' custom sort order
Dim sCustomList(1 To 3) As String
sCustomList(1) = "Cyberspace"
sCustomList(2) = "Aerospace"
sCustomList(3) = "Air, Land, or Sea"

Application.AddCustomList ListArray:=sCustomList
' use this if you want a list on the spreadsheet to sort by
' Application.AddCustomList ListArray:=Range("D1:D3")

oWorksheet.Sort.SortFields.Clear
oRangeSort.Sort Key1:=oRangeKey, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _
    Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

' clean up
Application.DeleteCustomList Application.CustomListCount
Set oWorksheet = Nothing
3qpi33ja

3qpi33ja2#

好的……根据更新的描述,为您正在排序的列旁边的列提供一个公式如何?
因此,如果“Air,Land,or Sea”在B1列中,则C1将有:

=SUBSTITUTE(B1,",","|")

然后你可以像这样做你的自定义排序:

MyWorksheet.Sort.SortFields.Add Key:=Range( _

        "B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _
        CustomOrder:= "Cyberspace,Air|Land|or Sea,Aerospace", _
        DataOption:=xlSortNormal  
    MyWorksheet.Sort.Apply

确保适当调整范围。

igsr9ssn

igsr9ssn3#

使用额外的引号也应该可以

CustomOrder:="""Cyberspace,Air"",""Land"",""or Sea,Aerospace"""

相关问题