2015-09-20 3 views
1

Я хочу отсортировать строки на основе значений в столбце G. Возможны 3 значения: Зеленый, Красный и Желтый. Я хочу, чтобы строки отсортированы с помощью Зеленый сверху, затем Желтый, затем Красный.Пользовательская сортировка с пользовательским заказом

Все Стараюсь результаты в порядке сортировки будучи алфавитным: Зеленый, Красного затем Желтого. Существует вторичная сортировка по столбцу R, но это работает нормально.

Последний код ниже. rr - номер последней строки. Я пробовал его с Order1:=xlAscending.

sCustomList = «Зеленый» «Желтый» «Красный»

Application.AddCustomList ListArray:=sCustomList 
    Range("A3:T" & rr).Sort Key1:=Range("G3:G" & rr), Order1:=xlAscending, _ 
    OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _ 
    DataOption1:=xlSortNormal, Key2:=Range("R3:R" & rr), Order2:=xlAscending 
+1

см. [Сортировка данных с использованием пользовательского списка] (https://support.office.com/en-us/article/Sort-data-using-a-custom-list-DEF8FF2B-681A-4FC3-9BD2-A06455C379E1). – Jeeped

+0

Спасибо Jeeped. Я вижу, как это работает, но мне нужно сделать это с помощью VBA. Это часть гораздо большего макроса –

ответ

1

Глядя на ваш код, то sCustomList выглядит как переменная типа строка, а не вариант массива. Мой успех с пользовательскими списками сортировки заключался в том, чтобы создавать новый каждый раз и использовать самый высокий индекс для ссылки на него.

Sub custom_sort() 
    Dim vCustom_Sort As Variant, rr As Long 

    vCustom_Sort = Array("green", "yellow", "red", Chr(42)) 
    Application.AddCustomList ListArray:=vCustom_Sort 

    With Worksheets("Sheet2") '<~~ set this properly! 
     .Sort.SortFields.Clear 
     rr = .Cells(Rows.Count, "G").End(xlUp).Row 
     With .Range("A3:T" & rr) 
      'use this to presort one or more secondary fields before the primary custom sort 
      '.Cells.Sort Key1:=.Columns(18), Order1:=xlAscending, _ 
         Key2:=.Columns(1), Order2:=xlDescending, _ 
         Orientation:=xlTopToBottom, Header:=xlYes 
      .Cells.Sort Key1:=.Columns(7), Order1:=xlAscending, _ 
         Orientation:=xlTopToBottom, Header:=xlYes, MatchCase:=False, _ 
         OrderCustom:=Application.CustomListCount + 1 

     End With 
     .Sort.SortFields.Clear 
    End With 

End Sub 

Существует поворот между .Cells.Sort.SortFields.Add и .Cells.Sort, что обычно создает некоторую путаницу. В .SortFields.Add method используется параметр CustomOrder:=, а Range.Sort method использует параметр OrderCustom:=. Эти два, безусловно, НЕ являются одними и теми же, но часто становятся взаимозаменяемыми с катастрофическими результатами.

+1

Для пользовательских списков я использовал метод GetCustomListNum, чтобы узнать, существует ли список. Метод возвращает '0', если это не так. –

1

Если вы используете объект SortFields, вам не нужно ссылаться на пользовательские списки: Ниже должно быть очевидно, где изменить различные ссылки диапазона. Я также добавил алфавитный рода на одном из отличных G


Option Explicit 
Sub TrafficLightSort() 
    Dim WS As Worksheet 
    Dim rSortRange As Range, rSortKey As Range 
    Const sSortOrder As String = "Green,Yellow,Red" 

Set WS = Worksheets("sheet1") 
With WS 
    Set rSortRange = Range("E1", .Cells(.Rows.Count, "E").End(xlUp)).Resize(columnsize:=3) 
    Set rSortKey = rSortRange.Columns(3) 

    With .Sort.SortFields 
     .Clear 
     .Add Key:=rSortKey, _ 
      SortOn:=xlSortOnValues, _ 
      Order:=xlAscending, _ 
      CustomOrder:=sSortOrder 
     .Add Key:=rSortRange.Columns(1), _ 
      SortOn:=xlSortOnValues, _ 
      Order:=xlAscending 
    End With 

    With .Sort 
     .SetRange rSortRange 
     .Header = xlNo 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .Apply 
    End With 
End With 

End Sub 

0

колонн я бы рекомендовал добавить таблицу с явным порядка сортировки на листе (зеленый = 1, желтый = 2, и т.д). Затем добавьте столбец в свой диапазон сортировки, который использует функцию поиска, чтобы вернуть значение сортировки и использовать VBA для запуска стандартной сортировки на основе этого столбца. Это оставит вам код VBA, который легче читать разработчикам, позволяет пользователям Excel, которые не читают VBA, видеть ваш порядок сортировки, и избегает хороших значений жесткого кодирования в глубине вашего макроса.

Смежные вопросы