Excel vba сортировка коллекции

Обновлено: 04.07.2024

Синтаксис полного кода VBA Excel, применяемого для сортировки данных в таблицах и диапазонах:

Синтаксис сокращенного кода VBA Excel, применяемого для сортировки данных с параметрами по умолчанию:

Expression – выражение, возвращающее объект Worksheet, например:

Расшифровка кода

1. Expression.Sort – метод Sort объекта Worksheet возвращает объект Sort.

Объект Sort – это объект, представляющий сортировку диапазона данных.

2. .SortFields.Clear – метод SortFields объекта Sort возвращает коллекцию объектов SortFields. Метод Clear объекта SortFields удаляет все существующие объекты SortField.

Объект SortField содержит все сведения о параметрах сортировки для заданного рабочего листа.

3. .SortFields.Add Key, SortOn, Order, DataOption – метод Add объекта SortFields создает и возвращает новый экземпляр объекта SortField с заданными параметрами.

Параметры метода Add объекта SortFields:

Key – обязательный параметр, который задает значение ключа для сортировки. Тип данных – Range. Обычно указывается первая ячейка столбца при сортировке по строкам или первая ячейка строки при сортировке по столбцам. Сортировка диапазона будет осуществлена по данным столбца (строки), первая ячейка которого указана в качестве ключа.

SortOn – необязательный параметр, который задает критерий сортировки (по какому свойству ячеек производится сортировка).

Значения, которые может принимать SortOn:

Константа Значение Описание
SortOnValues 0 сортировка по значению (значение по умолчанию)
SortOnCellColor 1 сортировка по цвету ячейки
SortOnFontColor 2 сортировка по цвету шрифта
SortOnIcon 3 сортировка по иконке*

* Иконки (значки) могут быть заданы ячейкам при условном форматировании диапазона.

Order – необязательный параметр, задающий порядок сортировки (по возрастанию или по убыванию).

Значения, которые может принимать Order:

Константа Значение Описание
xlAscending 1 сортировка по возрастанию (значение по умолчанию)
xlDescending 2 сортировка по убыванию

DataOption – необязательный параметр, который задает способ сортировки текста.

Значения, которые может принимать DataOption:

Константа Значение Описание
xlSortNormal 0 числовые и текстовые данные сортируются отдельно (значение по умолчанию)
xlSortTextAsNumbers 1 текстовые данные рассматриваются для сортировки как числовые

4. .SetRange [Range] – метод SetRange объекта Sort задает диапазон (таблицу), в котором выполняется сортировка.

5. .Header = [xlGuess, xlYes, xlNo] – свойство Header объекта Sort указывает, является ли первая строка таблицы строкой заголовков (шапкой).

Значения, которые может принимать свойство Header:

Константа Значение Описание
xlGuess 0 Excel сам определяет, есть ли строка заголовков
xlYes 1 строка заголовков есть, сортировка ее не затрагивает
xlNo 2 строки заголовков нет (значение по умолчанию)

6. .MatchCase = [True, False] – свойство MatchCase объекта Sort указывает, как учитывать регистр при сортировке.

Значения, которые может принимать свойство MatchCase:

Константа Значение Описание
False 0 регистр не учитывается (значение по умолчанию)
True 1 сортировка с учетом регистра

7. .Orientation = [xlTopToBottom, xlLeftToRight] – свойство Orientation объекта Sort задает ориентацию для сортировки.

Значения, которые может принимать свойство Orientation:

Константа Значение Описание
xlTopToBottom 1 сортировка по стокам (значение по умолчанию)
xlLeftToRight 2 сортировка по столбцам

8. .Apply – метод Apply объекта Sort выполняет сортировку диапазона в соответствии с примененными параметрами.

Примеры сортировки

Таблица для примеров


Сортировка по одному столбцу

Краткая запись кода VBA Excel для сортировки диапазона по первому столбцу с параметрами по умолчанию:

опоздал на игру. вот реализация алгоритм сортировки с объединением в VBA для массивов и коллекций. Я протестировал производительность этой реализации против реализации BubbleSort в принятом ответе, используя случайно сгенерированные строки. На приведенной ниже диаграмме представлены результаты, т. е.--14-->вы не должны использовать BubbleSort для сортировки коллекции VBA.

Performance Comparison

вы можете скачать исходный код от my Репозиторий GitHub или просто скопируйте / вставьте исходный код ниже в соответствующие модули.

для коллекции col , просто позвоните Collections.sort col .

модуль коллекции

модуль массивы

класс IVariantComparator

, если не IVariantComparator предоставляется sort методы, тогда естественный порядок предполагаемый. Однако, если вам нужно определить другой порядок сортировки (например, обратный) или если вы хотите сортировать пользовательские объекты, вы можете реализовать IVariantComparator интерфейс. Например, для сортировки в обратном порядке, просто создайте класс с именем CReverseComparator следующий код:

класс CReverseComparator

затем вызовите функцию сортировки следующим образом: Collections.sort col, New CReverseComparator

вы могли бы использовать ListView . Хотя это объект UI, вы можете использовать его функциональность. Он поддерживает сортировку. Вы можете хранить данные в Listview.ListItems а затем сортировать следующим образом:

Collection - довольно неправильный объект для сортировки.

точка сбора-обеспечить очень быстрый доступ к определенному элементу по ключу. Как элементы хранятся внутри, не имеет значения.

вы можете рассмотреть возможность использования массивов вместо коллекций, Если вам действительно нужна сортировка.

кроме этого, да, вы можете сортировать элементы в коллекции.
Нужно взять любой алгоритм сортировки на Интернет (вы можете google inplementations в основном на любом языке) и внести незначительные изменения, когда происходит своп (другие изменения не нужны, поскольку коллекции vba, такие как массивы, могут быть доступны с индексами). Чтобы поменять местами два элемента в коллекции, необходимо удалить их из коллекции и вставить обратно в нужные позиции (используя третий или четвертый параметр Add метод).

нет собственного вида для Collection в VBA, но так как вы можете получить доступ к элементам в коллекции через индекс, вы можете реализовать алгоритм сортировки для прохождения коллекции и сортировки в новую коллекцию.

здесь реализация алгоритма HeapSort для VBA / VB 6.

вот что кажется реализация алгоритма BubbleSort для ВБА/в VB6.

Если ваша коллекция не содержит объектов, и вам нужно только Сортировать по возрастанию, вам может быть проще понять:

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

этот фрагмент кода работает хорошо, но он находится в java.

чтобы перевести его, вы можете сделать это так:

SeriesManager-это просто класс, который хранит разницу между значениями to. Это действительно может быть любое числовое значение, которое вы хотите отсортировать. По умолчанию сортируется в порядке возрастания.

мне было трудно сортировать коллекцию в vba без создания пользовательского класса.

оно принимает собрание ссылкой, таким образом оно может легко возвратить его как функция и оно имеет опционный параметр для Восходящего и Нисходящего сортировать. Сортировка возвращает это в окне immediate:

это реализация VBA алгоритма QuickSort, который часто лучшая альтернатива MergeSort:

объекты, хранящиеся в коллекции, должны реализовать ISortableObject интерфейс, который должен быть определен в проекте VBA. Для этого добавьте модуль класса ISortableObject со следующим кодом:

Коллекция - довольно неподходящий объект для сортировки.

Сама цель коллекции - обеспечить очень быстрый доступ к определенному элементу, идентифицированному ключом. То, как предметы хранятся внутри, не имеет значения.

Вы можете рассмотреть возможность использования массивов вместо коллекций, если вам действительно нужна сортировка.

Помимо этого, да, вы можете сортировать элементы в коллекции.
Вам нужно взять любой алгоритм сортировки, доступный в Интернете (вы можете использовать google inplementations практически на любом языке), и внести небольшие изменения там, где происходит своп (другие изменения не нужны, поскольку коллекции vba, такие как массивы, могут быть доступны с помощью индексов). Чтобы поменять местами два элемента в коллекции, вам нужно удалить их оба из коллекции и вставить обратно в нужные места (используя третий или четвертый параметр метода Add ).

В VBA нет собственной сортировки для Collection , но поскольку вы можете получить доступ к элементам в коллекции через индекс, вы можете реализовать алгоритм сортировки, чтобы пройти через коллекцию и сортировать в новую коллекцию.

Вот реализация алгоритма HeapSort для VBA / VB 6.

Вот что похоже на реализацию алгоритма BubbleSort для VBA / VB6.

Если ваша коллекция не содержит объектов и вам нужно только сортировать по возрастанию, вам может быть проще понять:

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

Это моя реализация BubbleSort:

Он принимает коллекцию по ссылке, поэтому может легко вернуть ее как функцию и имеет необязательный параметр для сортировки по возрастанию и убыванию. Сортировка возвращает это в ближайшем окне:

Этот фрагмент кода работает хорошо, но на языке java.

Чтобы перевести это, вы могли бы сделать это так:

SeriesManager - это просто класс, в котором хранится разница между двумя значениями. Это действительно может быть любое числовое значение, по которому вы хотите отсортировать сортировку. По умолчанию выполняется сортировка по возрастанию.

Мне было трудно отсортировать коллекцию в vba без создания специального класса.

Это реализация алгоритма QuickSort на языке VBA, который часто является лучшей альтернативой MergeSort :

Объекты, хранящиеся в коллекции, должны реализовывать интерфейс ISortableObject , который должен быть определен в вашем проекте VBA. Для этого добавьте модуль класса ISortableObject со следующим кодом:

Поздно к игре . вот реализация алгоритма MergeSort в VBA как для массивов, так и для коллекций. . Я проверил производительность этой реализации по сравнению с реализацией BubbleSort в принятом ответе, используя случайно сгенерированные строки. В таблице ниже приведены результаты, т.е. вам не следует использовать BubbleSort для сортировки коллекции VBA.

Performance Comparison

Вы можете загрузить исходный код из моего репозитория GitHub или просто скопировать / вставить исходный код ниже в соответствующие модули.

Для сбора col просто позвоните Collections.sort col .

Модуль коллекций

Модуль массивов

Класс IVariantComparator

Если методам sort не предоставляется IVariantComparator , то предполагается естественный порядок. Однако, если вам нужно определить другой порядок сортировки (например, обратный) или если вы хотите отсортировать пользовательские объекты, вы можете реализовать интерфейс IVariantComparator . Например, для сортировки в обратном порядке просто создайте класс с именем CReverseComparator со следующим кодом:

Операция сортировки упорядочивает элементы последовательности на основе одного или нескольких атрибутов. Первый критерий сортировки выполняет первичную сортировку элементов. Указав второй критерий поиска, можно сортировать элементы внутри каждой группы первичной сортировки.

На следующем рисунке показаны результаты операции сортировки в алфавитном порядке в последовательности символов.

Рисунок с операциями сортировки в алфавитном порядке.

Далее перечислены методы стандартных операторов запроса, которые выполняют сортировку данных.

Методы

Имя метода Описание Visual Basic Синтаксис выражения запроса Дополнительные сведения
OrderBy Сортировка значений в возрастающем порядке. Order By Enumerable.OrderBy

Примеры синтаксиса выражений запросов

Примеры основной сортировки

Основная сортировка по возрастанию

В следующем примере показано использование предложения Order By в запросе LINQ для сортировки строк в массиве по длине строки в порядке возрастания.

Основная сортировка по убыванию

В следующем примере показано использование предложения Order By Descending в запросе LINQ для сортировки строк по их первой букве в порядке убывания.

Примеры дополнительной сортировки

Дополнительная сортировка по возрастанию

В следующем примере показано использование предложения Order By в запросе LINQ для выполнения основной и дополнительной сортировки строк в массиве. Строки сортируются основным образом по длине и дополнительно — по первой букве строки; в обоих случаях в возрастающем порядке.

Дополнительная сортировка по убыванию

В следующем примере показано использование предложения Order By Descending в запросе LINQ для выполнения основной сортировки по возрастанию и дополнительной сортировки по убыванию. Строки сортируются основным образом по длине и дополнительно — по первой букве строки.

Читайте также: