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

Dea*_*ill 10 sorting excel vba excel-vba

在VBA中,Excel允许使用CustomOrder参数对值进行排序,以选择已排序的序列项.不幸的是,项目序列由逗号分隔,我的一个排序项目包含逗号.例如,我想按第二列中的类别对第一列中的数据进行排序."空中,陆地或海洋"类别包含逗号.

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
Run Code Online (Sandbox Code Playgroud)

因此,自定义排序顺序应为"网络空间",然后是"空中,陆地或海洋",然后是"航空航天".但是,由于逗号,第二类被视为三类."Air,Land或Sea"行被排序到底部,因为Excel找不到自定义排序匹配.有没有办法让CustomOrder使用包含嵌入式逗号的类别?

我尝试在类别周围加上双引号,我尝试用分号替换分隔符逗号(希望Excel会接受分号而不是逗号).都没有奏效.

Ste*_*ory 15

似乎错过了Apply.你能加吗?

MyWorksheet.Sort.Apply
Run Code Online (Sandbox Code Playgroud)

您拥有的自定义订单在我的示例中正常工作.

编辑根据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
Run Code Online (Sandbox Code Playgroud)

  • 我遵循这个有效的解决方案 - 除了它导致Excel 2013在运行宏后尝试保存时崩溃.解决方案是在行之前添加行:`ActiveSheet.Sort.Sortfields.Clear`:`Application.DeleteCustomList Application.CustomListCount`详细信息:[answers.microsoft.com link](http://answers.microsoft.com/EN-US/MSOFFICE /论坛/ msoffice_excel-msoffice_custom /使用-deletecustomlist-IN-A-VBA宏死因-的Excel/dbf3ec99-0490-4f8d-AE96-de8eb75598a6?AUTH = 1) (3认同)