Сортировка данных в таблице на рабочем листе Excel средствами VBA. Sort и SortField, объекты и методы. Примеры сортировки данных в диапазоне.
Синтаксис сортировки
Синтаксис полного кода VBA Excel, применяемого для сортировки данных в таблицах и диапазонах:
With Expression.Sort .SortFields.Clear .SortFields.Add Key, SortOn, Order, DataOption .SetRange [Range] .Header = [xlGuess, xlYes, xlNo] .MatchCase = [True, False] .Orientation = [xlTopToBottom, xlLeftToRight] .Apply End With |
Синтаксис сокращенного кода VBA Excel, применяемого для сортировки данных с параметрами по умолчанию:
With Expression.Sort .SortFields.Clear .SortFields.Add Key .SetRange [Range] .Apply End With |
Expression – выражение, возвращающее объект Worksheet, например:
ActiveSheet Worksheets («Лист1») ActiveWorkbook.Worksheets («Лист1») Workbooks(«Книга1.xlsm»).Worksheets («Лист1») |
Расшифровка кода
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 для сортировки диапазона по первому столбцу с параметрами по умолчанию:
Sub Primer1() With ActiveSheet.Sort .SortFields.Clear .SortFields.Add Key:=Range(«A2») .SetRange Range(«A2:C7») .Apply End With End Sub |
Полная запись, но тоже с параметрами по умолчанию:
Sub Primer2() With ActiveSheet.Sort .SortFields.Clear .SortFields.Add Key:=Range(«A2»), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SetRange Range(«A2:C7») .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .Apply End With End Sub |
Результат сортировки:
Сортировка по двум столбцам
Код VBA Excel для сортировки исходной таблицы по первому и второму столбцам с параметрами по умолчанию:
Sub Primer3() With ActiveSheet.Sort .SortFields.Clear .SortFields.Add Key:=Range(«A2») .SortFields.Add Key:=Range(«B2») .SetRange Range(«A2:C7») .Apply End With End Sub |
Результат сортировки:
Применение сортировки ко второму столбцу (добавление еще одного объекта SortField) не нарушает сортировку первого – в первом столбце меняются местами только ячейки с одинаковыми значениями.
Excel macros might not be as comprehensive as other automation tools, but the validity and efficiency of Excel VBA can’t be undermined. If you work in Excel and other Microsoft Office tools like Word and Access, you can’t go wrong with VBA and its capabilities.
MS Excel is a powerful tool that offers a ton of options to its users. From storing data to creating automated dashboards, you can do it all in Excel and its spreadsheets.
If you want to use VBA to automate your sorting responsibilities in Excel, give these efficient easy-to-apply macros a try.
Download a Dummy Dataset
For starters, you can download a dummy dataset to work on your Excel macro skills.
Rest assured, once you get the hang of these macros and better understand how things work, you can shift the code to fit your own spreadsheets for work or school.
You can download the dataset used in this article if you’d like to follow along.
Download: Excel Dataset
1. Sorting One Column Using Excel Macros
Use this simple code to sort a data column within an Excel spreadsheet. If you downloaded the dummy dataset, you can try sorting column E (Units Sold).
Open a new Excel file and save it with an Excel Macro-Enabled Workbook (.xlsm) workbook type. This file will store the macro to sort your data from another file.
You will be controlling your file(s) from the macro file, which will interact with your workbooks separately.
Enter the following code:
Sub sortwithheaders()Workbooks("Financial Sample.xlsx").Sheets(1).Activate
Range("A1:P701").sort Key1:=Range("e1"), Order1:=xlAscending, Header:=xlYes
End Sub
Where:
- Key1: Define the column(s) that you want to sort
- Order1: Ordering method (ascending/descending)
- Header: If your content has headers, this option will remain as xlYes. Alternatively, select xlNo.
The range will consist of the starting cell and ending cell address so that everything is captured for sorting purposes. The result is that your entire data set will be sorted based on the data in column E.
2. Sorting Dynamic Data in a Single Column
There may be instances wherein your starting point is defined, but your endpoint is dynamic. In such a case, you can make your code dynamic so that it picks up the end of the range automatically.
To accommodate the change in data, use the code below:
Sub sortwithheaders()Workbooks("Financial Sample.xlsx").Sheets(1).Activate
Range("A1", Range("A1").End(xlDown)).sort Key1:=Range("e2"), Order1:=xlAscending, Header:=xlYes
End Sub
Where:
- End(xlDown): This function will auto-pick the last populated cell automatically
Note: If the formula encounters a blank cell within a column, it will consider the preceding cell as the end of the range.
3. Sorting Multiple Columns Together
There might be situations when you want to sort data in multiple columns in one go. To do so, you can use the following code to achieve your purpose:
Sub SortMultipleColumns()With Worksheets("Sheet1")
With .Cells(1, "A").CurrentRegion
.Cells.sort Key1:=.Range("B1"), Order1:=xlAscending, _
Key2:=.Range("E1"), Order2:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes
End With
End With
End Sub
4. Sorting Columns Across Multiple Sheets
When you’re dealing with multiple sheets, you might want to get your data ready to be put into a dashboard. One of the most important aspects of data preparation is sorting it, and getting the data arranged in a certain format to present to your stakeholders or clients.
One option is to cycle through each sheet manually, sort the required columns, and then proceed to the next step. Alternatively, why not let VBA do it for you?
The intent of the code below is to cycle through each available sheet in the workbook, and based on the columns specified, sort the available data.
Here’s how you can sort columns across multiple sheets:
Sub SortWS()
Dim ws As Worksheet
'Activate the intended worksheet
Workbooks("Financial Sample.xlsx").Activate
'Cycle through each individual worksheet automatically using for loop
For Each ws In ActiveWorkbook.Sheets
'activate each individual worksheet
ws.Activate
'Define the range and then sort the column basis your requirements. In this case, only one column in being sorted.
Range("A1", Range("p1").End(xlDown)).sort Key1:=Range("E1"), Order1:=xlDescending, Header:=xlYes
'Command used to cycle to the next worksheet, once the previous worksheet has been sorted
Next ws
End Sub
All the information starting with single quotes are VBA comments. These are not executed during the execution stage. However, every VBA comment you add is a meaningful addition to the code, as you can define the essence, functionality, and other relevant portions within the code sections.
5. Copying Sorted Data From One Sheet to Another
Imagine a situation where you want to sort the data and copy the whole dataset (or parts thereof) into a newly added sheet. In such cases, you can use the below code to perform the task at hand:
Sub SortWS()Dim ws As Worksheet
'Activate the intended worksheet
Workbooks("Financial Sample.xlsx").Activate
'Cycle through each individual worksheet automatically using for loop
For Each ws In ActiveWorkbook.Sheets
'activate each individual worksheet
ws.Activate
'Define the range and then sort the column basis your requirements.
'In this case, only one column in being sorted.
Range("A1", Range("p1").End(xlDown)).sort Key1:=Range("E1"), Order1:=xlDescending, Header:=xlYes
'Command used to cycle to the next worksheet, once the previous worksheet has been sorted
Next ws
'Create a new worksheet within the workbook to store the new data
ActiveWorkbook.Sheets.Add.Name = "Results"
'Copy paste the sorted data into the newly added sheet
Sheets("Sheet1").Range("A1:p701").Copy Destination:=Sheets("Results").Range("a1")
End Sub
The above code will sort the values in column E, add a new sheet Results into the existing workbook, and paste the sorted results in cell A1.
Creating Sorting Macros in Excel
Excel VBA is a nifty language that can save you a lot of time and effort. By using VBA macros, you can create extensive dashboards, easily sort data with a few clicks, and perform different functions with ease.
Luckily, Excel’s functionality doesn’t end with macros. Check out some tips and tricks to become a more efficient Excel user.
Nero50789454 Пользователь Сообщений: 5 |
#1 22.09.2016 21:02:52 Здравствуйте! нужен макрос который сортирует данные из таблицы по столбцам по убыванию, каждого столбца независимо от других столбцов, нашел макрос который сортирует строки, но не получается его переделать под столбцы, может кто поможет в данном вопросе
|
||
Мотя Пользователь Сообщений: 3218 |
А не проще ли таблицу транспонировать? |
в таблицах 150 столбцов и больше 5000 строк, а сортировать каждый столбец вручную стандартными методами очень долго Изменено: Nero50789454 — 22.09.2016 21:24:15 |
|
Мотя Пользователь Сообщений: 3218 |
1. Ваша таблица регламентна? |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#5 22.09.2016 21:54:27
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
количество столбцов может меняться Изменено: Nero50789454 — 22.09.2016 22:01:55 |
|
Nero50789454 Пользователь Сообщений: 5 |
#7 22.09.2016 22:04:30
спасибо!!! помогло!!! |
||
vikttur Пользователь Сообщений: 47199 |
Всегда удивляюсь: для чего люди в ник вставляют кучу цифр? Красота? Смотрится непонятно… Выделиться? Глупо выделяться таким образом. Пароль агента с другого форума или размер обуви троюродного дедушки? |
Мотя Пользователь Сообщений: 3218 |
Полагаю, столбы — Дата, Время — не участвуют в сортировке? |
Nero50789454 Пользователь Сообщений: 5 |
#10 22.09.2016 23:20:04
они для первичной обработки, а в следствии не учитываются
тебе не все ли равно? не знаешь что написать, лучше ни чего не писать |
||||
vikttur Пользователь Сообщений: 47199 |
#11 22.09.2016 23:38:24 Мне, как модератору, не все равно.
У нас на форуме принято с незнакомыми общаться на «Вы» |
||
Юрий М Модератор Сообщений: 60588 Контакты см. в профиле |
#12 23.09.2016 00:04:45
Во-первых, не нужно ТЫКАТЬ незнакомому человеку. |
||
Макрос-сортировка столбца |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Skip to content
На чтение 3 мин. Просмотров 1.3k.
Что делает макрос: Если часто добавлять данные в ваши сводные таблицы, вы можете заметить, что новые данные автоматически не попадают в порядок сортировки существующих данных. Вместо этого, он прикрепляется к нижней части существующих данных. Это означает, что ваши раскрывающиеся списки показывают все новые данные в самом низу, в то время как существующие данные сортируются в алфавитном порядке. Макрос дает возможность сортировать все поля сводной в алфавитном порядке.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
Этот макрос сбрасывает сортировку на все поля, гарантируя, тем самым, что новые данные встанут на место. Идея заключается в том, чтобы запускать макрос каждый раз при обновлении сводной таблицы. В коде, мы проходим через каждое поле данных в сводной таблице и сортируем каждое из них.
Код макроса
Sub SortirovatPolyaSvodnoiPoAlfavitu() 'Шаг 1: Объявляем переменные Dim pt As PivotTable Dim pf As PivotField 'Шаг 2: Курсор на активную ячейку в сводной таблице On Error Resume Next Set pt = ActiveSheet.PivotTables(ActiveCell.PivotTable.Name) 'Шаг 3: Выход, если активная ячейка не в сводной таблице If pt Is Nothing Then MsgBox "Вы должны поместить курсор в сводную таблицу." Exit Sub End If 'Шаг 4: Перебрать все сводные поля и отсортировать For Each pf In pt.PivotFields pf.AutoSort xlAscending, pf.Name Next pf End Sub
Как этот код работает
- Шаг 1 объявляет две переменные объекта, используя Pt в качестве контейнера памяти для сводной таблицы и Pf в качестве контейнера для памяти наших полей данных. Это позволяет макросу перебрать все поля данных в сводной таблице.
Активная ячейка должна находиться внутри сводной таблицы для запуска макроса. Когда курсор находится внутри определенной сводной таблицы, действие макроса выполняется на этой оси. - На шаге 2 мы устанавливаем переменную Pt на имя сводной таблицы, на которой найдена активная ячейка. Мы делаем это, используя свойство ActiveCell.PivotTable.Name, чтобы получить имя целевой сводной.
Если активная ячейка не находится внутри сводной таблицы, выдается ошибка. Именно поэтому мы используем On Error Resume Next Statement. Это говорит Excel продолжить макро, если есть ошибка. - Шаг 3 проверяет, заполнена ли переменная PT сводной таблицы объекта. Если переменная PT установлена в Nothing, активная ячейка была не на сводной таблице, таким образом, сводной таблице не может быть присвоена переменная. Если дело обстоит именно так, то макрокоманда помещает окно сообщения, чтобы уведомить пользователя, а затем выходит
из процедуры. - И, наконец, мы используем оператор For Each, чтобы перебирать поля сводной. Каждый раз, когда выбрано новое поле сводной, мы используем метод AutoSort, чтобы сбросить автоматические правила сортировки для поля. В этом случае мы сортируем все поля в порядке возрастания. После того как все поля данных были оценены, макрос заканчивается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.