Code an Excel VBA sort with a custom order and a value containing commas

前端 未结 2 826
孤独总比滥情好
孤独总比滥情好 2020-11-28 14:57

In VBA, Excel allows sorting values using the CustomOrder parameter to choose the sequence items are ordered. Unfortunately, the sequence of items is delimited by commas and

相关标签:
2条回答
  • 2020-11-28 15:08

    It seems to be missing the Apply. Can you Add

    MyWorksheet.Sort.Apply
    

    The custom order you have is working as is in my sample.

    EDIT Updated based on OP updated question

    Edit the macro to the following - using an array for the OrderCustom parameter.

    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
    
    0 讨论(0)
  • 2020-11-28 15:19

    OK...based on the updated description, how about a formula for the column next to what you're sorting.

    So, if "Air, Land, or Sea" is in column B1, then C1 would have this:

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

    Then you could do your custom sort like so:

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

    Make sure to adjust the range appropriately.

    0 讨论(0)
提交回复
热议问题