Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel для iPad Excel для iPhone Excel для планшетов с Android Excel для телефонов с Android Еще…Меньше
Функция СОРТ сортирует содержимое диапазона или массива.
В этом примере используется отдельная сортировка по регионам, продавцам и продуктам с помощью формулы =СОРТ(A2:А17), скопированной в ячейки F2, H2 и J2.
Функция СОРТ возвращает отсортированный массив элементов в массиве. Возвращаемый массив имеет ту же форму, что и предоставленный аргумент массива.
=СОРТ(массив;[индекс_сортировки];[порядок_сортировки];[по_столбцу])
Аргумент |
Описание |
---|---|
массив Обязательный |
Диапазон или массив для сортировки |
[индекс_сортировки] Необязательный |
Число, указывающее строку или столбец, по которым нужно выполнить сортировку. |
[порядок_сортировки] Необязательный |
Число, указывающее нужный порядок сортировки: 1 для сортировки по возрастанию (по умолчанию), -1 для сортировки по убыванию |
[по_столбцу] Необязательный |
Логическое значение, указывающее нужное направление сортировки: ЛОЖЬ для сортировки по строкам (по умолчанию), ИСТИНА для сортировки по столбцам |
Примечания:
-
Если аргумент «индекс_сортировки» не указан, предполагается строка 1 или столбец 1. Если не указан порядок сортировки, применяется сортировка по возрастанию. По умолчанию Excel выполняет сортировку по строкам, а сортировка по столбцам применяется, если аргументу «по_столбцу» присвоено значение ИСТИНА. Если аргументу «по_столбцу» присвоено значение ЛОЖЬ или он отсутствует, Excel выполняет сортировку по строкам.
-
Функция СОРТ предназначена для сортировки данных в массиве. Если вы хотите отсортировать данные в сетке, лучше использовать функцию СОРТПО, поскольку она удобнее. Функция СОРТПО учитывает добавления или удаления столбцов, так как она ссылается на диапазон, а функция СОРТ ссылается на номер индекса столбца.
-
Массив может рассматриваться как строка со значениями, столбец со значениями или комбинация строк и столбцов со значениями. В приведенном выше примере исходным массивом для формулы СОРТ является диапазон A5:D20.
-
Функция СОРТ возвращает массив, который будет рассеиваться, если это будет конечным результатом формулы. Это означает, что Excel будет динамически создавать соответствующий по размеру диапазон массива при нажатии клавиши Enter. Если ваши вспомогательные данные хранятся в таблице Excel, тогда массив будет автоматически изменять размер при добавлении и удалении данных из диапазона массива, если вы используете Структурированные ссылки. Дополнительные сведения см. в статье Поведение рассеянного массива.
-
Приложение Excel ограничило поддержку динамических массивов в операциях между книгами, и этот сценарий поддерживается, только если открыты обе книги. Если закрыть исходную книгу, все связанные формулы динамического массива вернут ошибку #ССЫЛКА! после обновления.
Примеры
Сортировка диапазона значений по убыванию.
Совместное использование функций СОРТ и ФИЛЬТР, чтобы отсортировать диапазон по возрастанию и ограничить его значениями, превышающими 5000.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
См. также
Функция ФИЛЬТР
Функция СЛУЧМАССИВ
Функция ПОСЛЕДОВ
Функция СОРТПО
Функция УНИК
Ошибки #ПЕРЕНОС! в Excel
Динамические массивы и поведение массива с переносом
Оператор неявного пересечения: @
Нужна дополнительная помощь?
Сортировка одномерного массива в VBA Excel по возрастанию или убыванию с числовым или текстовым сравнением числовых элементов. Сортировка выбором.
Сортировка массива выбором
Функция, осуществляющая сортировку выбором одномерного массива по возрастанию с числовым сравнением числовых элементов массива:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Function SortArray(myArray As Variant) As Variant Dim l As Long, u As Long, i1 As Long, i2 As Long, im As Long, tmp As Variant ‘Определение наименьшего индекса массива l = LBound(myArray) ‘Определение наибольшего индекса массива u = UBound(myArray) For i1 = l To u im = i1 For i2 = i1 To u ‘Поиск наименьшего элемента массива, начиная с элемента myArray(i1) If myArray(i2) < myArray(im) Then im = i2 Next ‘Если наименьший элемент не является текущим (im <> i1), ‘тогда наименьший элемент и текущий меняются местами If im <> i1 Then tmp = myArray(i1) myArray(i1) = myArray(im) myArray(im) = tmp End If Next SortArray = myArray End Function |
Внешний цикл сравнивает по очереди каждый элемент массива с наименьшем элементом, найденным вложенным циклом среди оставшихся элементов (с бóльшими индексами), и, если наименьший элемент myArray(im)
не является текущим элементом myArray(i1)
, они меняются местами.
Функция с выбором вида сортировки
Функция сортировки одномерного массива с дополнительным параметром mySort, который позволяет выбрать сортировку по возрастанию или убыванию и с числовым или текстовым сравнением числовых элементов массива:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Function SortArrayNew(myArray As Variant, mySort As Long) As Variant Dim l As Long, u As Long, i1 As Long, i2 As Long, im As Long, tmp As Variant l = LBound(myArray) u = UBound(myArray) For i1 = l To u im = i1 For i2 = i1 To u Select Case mySort Case Is = 0 If myArray(i2) < myArray(im) Then im = i2 Case Is = 1 If CStr(myArray(i2)) < CStr(myArray(im)) Then im = i2 Case Is = 2 If myArray(i2) > myArray(im) Then im = i2 Case Is = 3 If CStr(myArray(i2)) > CStr(myArray(im)) Then im = i2 End Select Next If im <> i1 Then tmp = myArray(i1) myArray(i1) = myArray(im) myArray(im) = tmp End If Next SortArrayNew = myArray End Function |
Значения, которые может принимать параметр mySort:
Значение | Вид сортировки |
---|---|
0 | по возрастанию с числовым сравнением чисел |
1 | по возрастанию с текстовым сравнением чисел |
2 | по убыванию с числовым сравнением чисел |
3 | по убыванию с текстовым сравнением чисел |
Пример сортировки массива
Пример использования разных видов сортировки одномерного массива в VBA Excel с выводом результатов на рабочий лист:
Sub Primer() Dim myArr As Variant, x As Variant, i As Long, n As Long For i = 1 To 4 myArr = Array(46, 25, «Лето», 508, 35, «лес», 11, 5, «25ф», «Лес», 45, 58, «лето», 350) myArr = SortArrayNew(myArr, i — 1) n = 1 For Each x In myArr Cells(n, i) = myArr(n — 1) n = n + 1 Next Next End Sub |
Результаты разных видов сортировки массива myArr:
Сортировка данных – распространенный способ упорядочивания значений от большего к меньшему, по алфавиту или другим параметрам. В Excel это можно сделать несколькими методами – обращаясь к функциям или используя пункты в меню.
Вариант 1: Быстрая сортировка в Excel
Иногда требуется максимально быстро отсортировать данные в столбце по возрастанию чисел, убыванию или по алфавиту. Для этого идеально подойдут кнопки быстрой сортировки, предназначенные как раз для выполнения поставленной задачи.
-
Выделите зажатой левой кнопкой мыши столбец с данными и вызовите меню «Редактирование».
-
Откройте список «Сортировка и фильтр» и выберите подходящий для вас вариант упорядочения. С числами это по возрастанию или убыванию, а для текста – по алфавиту и в обратную сторону.
-
Если вы выделили не все ячейки в столбце, появится окно с предложением расширить диапазон. Сделайте это, если за пределами выделения тоже находятся значения, которые нужно сортировать. Укажите сортировку в пределах данного диапазона, если за ним находятся исключительно заголовки.
-
Изменения вступают в силу сразу же. Нажмите Ctrl + Z для отмены действия, если что-то выполнено неправильно.
Обратите внимание на то, что сортировка сбивается после внесения любых изменений в клетках. Придется снова обращаться к тем же самым кнопкам, упорядочив уже новый массив с данными.
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Подписаться
Вариант 2: Настраиваемая сортировка
Более продвинутый вариант, позволяющий задать сразу несколько условий упорядочения, – это настраиваемая сортировка, выполняющаяся через соответствующее окно. Давайте разберем сортировку по двум разным параметрам:
-
Вы можете не выделять заранее столбец, если для него задано название. Вызовите то же меню редактирования, но на этот раз нажмите по «Настраиваемая сортировка».
-
Выберите вариант с расширением или сохранением диапазона, если предварительно выделили столбец.
-
Вы увидите первый уровень сортировки, который и стоит настроить с самого начала.
-
Выберите столбец для сортировки из первого выпадающего списка.
-
Далее укажите вариант сортировки. Это может быть значение, цвет шрифта или ячейки, знаки условного форматирования.
-
В завершение укажите, в каком порядке необходимо отсортировать данные.
-
Если затем нужно применить еще один вариант сортировки, добавьте уровень и настройте его должным образом.
-
После применения вернитесь к таблице и убедитесь в том, что действия произведены верно. Учитывайте, что в этом случае сортировка тоже собьется, если вы внесете изменения в любой ячейке.
Вариант 3: Функция НАИБОЛЬШИЙ или НАИМЕНЬШИЙ
Последний вариант – единственный динамический, то есть после внесения изменений в клетках сортировка автоматически перестроится и ее последовательность будет правильной. Как вы уже поняли, для этого понадобится использовать функцию НАИБОЛЬШИЙ или НАИМЕНЬШИЙ.
-
В пустом столбце выберите первую ячейку для сортировки (желательно, чтобы она находилась параллельно ячейке с существующего столбца). Вызовите одну из указанных функций, отталкиваясь от необходимого вам типа упорядочения.
-
Далее в скобках укажите (C:C;СТРОКА(C1)), поменяв буквы на номер столбца сортировки.
-
Растяните функцию, зажав левую кнопку мыши в правой нижней точке ячейки и потянув вниз. Вы увидите, что данные указанного столбца перенесены параллельно, но соблюдена сортировка по возрастанию или убыванию. При этом исходные данные остаются в таком же хаотичном порядке, как были и раньше.
Теперь в исходном столбце вы можете вносить любые изменения для значений, а параллельные данные в отсортированном столбце поменяются в зависимости от указанных данных, но порядок все равно будет правильным.
Используйте любой из вариантов сортировки по надобности, но учитывайте, что динамически меняется только способ с применением функции. Конечно, он потребует создания дополнительного столбца, но в некоторых случаях это является оптимальным решением. Только не забудьте дать название столбцу, чтобы все пользователи таблицы понимали, для чего он нужен на листе.
Сортировка формулой
Если вам нужно отсортировать список, то к вашим услугам куча способов, самый простой из которых — кнопки сортировки на вкладке или в меню Данные (Data — Sort). Бывают, однако, ситуации, когда сортировку списка нужно делать автоматически, т.е. формулами. Такое может потребоваться, например, при формировании данных для выпадающего списка, при вычислении данных для диаграмм и т.д. Как же «на лету» сортировать список формулой?
Способ 1. Числовые данные
Если список содержит только числовую информацию, то его сортировку можно легко сделать с помощью функций НАИМЕНЬШИЙ (SMALL) и СТРОКА (ROW):
Функция НАИМЕНЬШИЙ (SMALL) выдергивает из массива (столбец А) n-й по счету наименьший элемент. Т.е. НАИМЕНЬШИЙ(A:A;1) — это самое маленькое число из столбца, НАИМЕНЬШИЙ(А:А;2) — второе по счету наименьшее и т.д.
Функция СТРОКА (ROW) выдает порядковый номер строки для указанной ячейки, т.е. СТРОКА(А1)=1, СТРОКА(A2)=2 и т.д. В данном случае она используется просто как генератор последовательности чисел n=1,2,3… для нашего отсортированного списка. С тем же успехом можно было сделать дополнительный столбец, заполнить его вручную числовой последовательностью 1,2,3… и ссылаться на него вместо функции СТРОКА.
Способ 2. Текстовый список и обычные формулы
Если в списке не числа, а текст, то функция НАИМЕНЬШИЙ (SMALL) уже не сработает, поэтому придется пойти другим, чуть более длинным, путем.
Сначала добавим служебный столбец с формулой, где будет вычисляться порядковый номер каждого имени в будущем отсортированном списке с помощью функции СЧЁТЕСЛИ (COUNTIF):
В английской версии это будет:
=COUNTIF(A:A,»<«&A1)+COUNTIF($A$1:A1,»=»&A1)
Первое слагаемое — это функция подсчета количества ячеек, которые меньше текущей. Второе — подстраховка на случай, если какое-либо имя встречается больше одного раза. Тогда они будут иметь не одинаковые, а последовательно возрастающие номера.
Теперь полученные номера надо расставить последовательно по возрастанию. Для этого можно использовать функцию НАИМЕНЬШИЙ (SMALL) из первого способа:
Ну, и наконец, осталось просто вытащить из списка имена по их номерам. Для этого можно использовать такую формулу:
Функция ПОИСКПОЗ (MATCH) ищет в столбце В нужный порядковый номер (1, 2, 3 и т.д.) и выдает, по сути, номер строки, где находится это число. Функция ИНДЕКС (INDEX) вытаскивает из столбца А имя по этому номеру строки.
Способ 3. Формула массива
Этот способ представляет собой, по сути, тот же алгоритм расстановки, что и в Cпособе-2, но реализованный формулой массива. Для упрощения формулы диапазону ячеек С1:С10 было дано имя List (выделить ячейки, нажать Ctrl+F3 и кнопку Создать):
В ячейку Е1 копируем нашу формулу:
=ИНДЕКС(List; ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ(List; «<«&List); СТРОКА(1:1)); СЧЁТЕСЛИ(List; «<«&List); 0))
Или в англоязычной версии:
=INDEX(List, MATCH(SMALL(COUNTIF(List, «<«&List), ROW(1:1)), COUNTIF(List, «<«&List), 0))
и нажимаем Ctrl+Shift+Enter, чтобы ввести ее как формулу массива. Потом полученную формулу можно скопировать вниз на всю длину списка.
Если нужно, чтобы формула учитывала не фиксированный диапазон, а могла подстраиваться при дописывании новых элементов к списку, то нужно будет слегка изменить стратегию.
Во-первых, диапазон List нужно будет задать динамически. Для этого при создании нужно указать не фиксированный диапазон C3:C10, а специальную формулу, которая будет ссылаться на все имеющиеся значения независимо от их количества. Нажмите Alt+F3 или откройте вкладку Формулы — Диспетчер имен (Formulas — Name Manager), создайте новое имя и в поле Ссылка (Reference) впишите вот такую формулу (я предполагаю, что диапазон сортируемых данных начинается с ячейки C1):
=СМЕЩ(C1;0;0;СЧЁТЗ(C1:C1000);1)
=OFFSET(C1,0,0,СЧЁТЗ(C1:C1000),1)
Во-вторых, вышеописанную формулу массива нужно будет протянуть вниз с запасом — с расчетом на вводимые в будущем дополнительные данные. При этом формула массива начнет выдавать ошибку #ЧИСЛО на незаполненных пока ячейках. Чтобы ее перехватить, можно использовать функцию ЕСЛИОШИБКА, которую нужно дописать «вокруг» нашей формулы массива:
=ЕСЛИОШИБКА(ИНДЕКС(List; ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ(List; «<«&List); СТРОКА(1:1)); СЧЁТЕСЛИ(List; «<«&List); 0));»»)
=IFERROR(NDEX(List, MATCH(SMALL(COUNTIF(List, «<«&List), ROW(1:1)), COUNTIF(List, «<«&List), 0));»»)
Она перехватывает ошибку #ЧИСЛО и выводит вместо нее пустоту (пустые кавычки).
Ссылки по теме:
- Сортировка диапазона по цвету
- Что такое формулы массива и зачем они нужны
- Сортировка функцией СОРТ и динамические массивы в новом Office 365
18K
24 мая 2007 года
pavel55
79 / / 14.05.2007
хм, если нужно сортировать данные в ячейках, то лучше воспользоваться встроенной Сортировкой. Если вы хотите сортировать массивы данных (не на листе), то вот пару примеров
Сортировка массивов (не помню на каком форуме взял)
Код:
Sub MyBubbleSort(arr, Optional k As Byte = 0) ‘ Сортировка простым обменом ‘ ort by [E]lementary [E]xchange
Dim i As Long, j As Long, t As Variant
On Error Resume Next
For i = UBound(arr) To LBound(arr) + 1 Step -1
For j = LBound(arr) To i — 1
If CSng(Left(arr(j), Len(arr(j)) — k)) > CSng(Left(arr(j + 1), Len(arr(j + 1)) — k)) Then
t = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = t
End If
Next
Next
End Sub
Код:
Sub MyQuickSort(arr, Optional First As Long = -1, Optional Last As Long = -1) ‘ Быстрая сортировка, [Q]uick ort
Dim i As Long, j As Long, MidEl As Variant, t As Variant
On Error Resume Next
First = IIf(First = -1, LBound(arr), First)
Last = IIf(Last = -1, UBound(arr), Last)
i = First
j = Last
MidEl = arr((First + Last) 2)
Do While i <= j
If arr(i) < MidEl Then
i = i + 1
Else
If arr(j) > MidEl Then
j = j — 1
Else
t = arr(i)
arr(i) = arr(j)
arr(j) = t
i = i + 1
j = j — 1
End If
End If
Loop
If First < j Then Call MyQuickSort(arr, First, j)
If i < Last Then Call MyQuickSort(arr, i, Last)
End Sub