Кодирование сортировки Excel VBA с пользовательским заказом и значением, содержащим запятые - PullRequest
9 голосов
/ 23 мая 2011

В 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

Итак, пользовательский порядок сортировки должен быть «Киберпространство», затем «Воздух, Земля или Море», а затем «Аэрокосмос». Однако вторая категория рассматривается как три категории из-за запятых. Строки с надписью «Воздух, Земля или Море» сортируются снизу, потому что Excel не находит для них пользовательскую сортировку. Есть ли способ заставить CustomOrder работать с категорией, содержащей встроенные запятые?

Я попытался поместить двойные кавычки вокруг категории и попытался заменить запятые с разделителями точкой с запятой (в надежде, что Excel примет точку с запятой вместо запятой). Ни один не работал.

Ответы [ 2 ]

14 голосов
/ 24 мая 2011

Кажется, что отсутствует 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
0 голосов
/ 23 мая 2011

ОК ... на основании обновленного описания, как насчет формулы для столбца рядом с тем, что вы сортируете.

Итак, если "Воздух, Земля или Море" в столбце 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

Убедитесь, что вы правильно настроили диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...