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

在VBA中,Excel允许使用CustomOrder参数来sorting值,以selectsorting项目。 不幸的是,项目的顺序是由逗号分隔,我的一个sorting项目包含逗号。 例如,我想按第二列中的类别对第一列中的数据进行sorting。 “空气,陆地或海洋”类别包含逗号。

  Data1航空航天
 Data2networking空间
 Data3networking空间
 Data4空气,陆地或海洋
 Data5航空航天
 Data6空气,陆地或海洋
 Data7networking空间

如果您录制VBAmacros,则创build的代码如下所示:

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

所以,自定义sorting顺序应该是“networking空间”,然后是“空气,陆地或海洋”,然后是“航空航天”。 但是,第二类因逗号而被视为三类。 “空气,陆地或海洋”行被sorting到底部,因为Excel没有find自定义的sorting匹配。 有没有办法让CustomOrder使用包含embedded逗号的类别?

我试着在类别周围加双引号,我试着用分号replace分隔符(希望Excel能接受分号而不是逗号)。 都没有工作。

这似乎是错过了Apply 。 你可以添加吗?

 MyWorksheet.Sort.Apply 

您所拥有的自定义顺序在我的示例中正常运行。

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

将macros编辑为以下内容 – 使用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 

好的…根据更新的说明,如何sorting旁边列的公式。

所以,如果“B1,B1,B1,…”中有“Air,Land,or Sea”

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

那么你可以做你自定义sorting如下:

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

确保适当调整范围。