Сортировка данных в таблице на рабочем листе 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) не нарушает сортировку первого – в первом столбце меняются местами только ячейки с одинаковыми значениями.
To sort data use the Sort method.
expression .Sort(Key1, Order1, Key2, Type, Order2, Key3,Order3, Header, OrderCustom, _ MatchCase, Orientation, SortMethod, DataOption1,DataOption2, DataOption3)
5 FREE EXCEL TEMPLATES
Plus Get 30% off any Purchase in the Simple Sheets Catalogue!
Sort on a Single Column
This code would sort the database above in ascending date order.
Range("A1").CurrentRegion.Sortkey1:=Range("B1"), order1:=xlAscending, Header:=xlYes
Or, if you have named your columns…
Range("A1").CurrentRegion.Sortkey1:=Range("Date"), order1:=xlAscending, Header:=xlYes
Sort on Up to Three Columns
This code would sort the table by payment type and within payment type by date. You can sort by up to 3 columns as there or three available key parameters. Key 1 is the primary sort.
Range("A1").CurrentRegion.Sort_ key1:=Range("Pay_Type"),order1:=xlDescending, _ key2:=Range("Date"),order2:=xlAscending, _ Header:=xlYes
Sort by More than Three Columns
This code would sort PAY_TYPE, and within PAY_TYPE by STORE_ID, within STORE_ID by PRODUCT_ID and then within PRODUCT_ID by DATE. Note that the primary sort is the last sort applied in the code: so you list the sorts in reverse order of importance.
Range("A1").CurrentRegion.Sort_ key1:=Range("Date"),order1:=xlDescending, Header:=xlYes Range("A1").CurrentRegion.Sort_ key1:=Range("Prod_ID"),order1:=xlDescending, Header:=xlYes Range("A1").CurrentRegion.Sort_ key1:=Range("Store_ID"),order1:=xlDescending, Header:=xlYes Range("A1").CurrentRegion.Sort_ key1:=Range("Pay_Type"),order1:=xlDescending, Header:=xlYes
To sort a range of cells using VBA, you need to use the “SORT” method that allows you to set a single key (column) or multiple keys (for multiple columns) to sort. You can also define the order (ascending or descending) in which you want to sort, and you can specify if you have a header or not.
Sort a Range with VBA
- Use the range object to specify the range that you wish to sort.
- Type a dot and enter the sort method.
- Specify the key that you want to use to sort.
- Define the sorting order.
- Mention if you have a header or not.
Range("A1:A11").Sort Key1:=Range("A1"), _
Order1:=xlAscending, _
Header:=xlYes
In the above code, you have used the range A1:A11, and in the sort method, you have used the ascending order, mentioned that you have a header in the range.
Understanding the VBA’s Sort Method
Before you write a macro to sort a range it’s better to make deep dive into the sort method and understand its arguments.
Sort (Key1, Order1, Key2, Type, Order2, Key3, Order3, _
Header, OrderCustom, MatchCase, Orientation, SortMethod, _
DataOption1, DataOption2, DataOption3)
The following are the most important arguments that you will be using in the real life.
- Key: Here you need to define a cell whose column you want to use as a base to sort.
- Order: Order in which you want to sort the column (ascending/descending).
- Header: A constant to specify if you have a header or not or you want VBA to guess.
In the following code, I have used the “xlDescending” to sort amount column using descending order.
Range("A1:A13").Sort Key1:=Range("A1"), _
Order1:=xlDescending, _
Orientation:=xlSortColumns
Using Multiple Columns (Keys) to Sort
You can also use more than one column to sort a range. Let’s take an example of the below table where you have multiple entries with employee names and cities, and you need to sort using the name and city.
Here’s the code that you need to use:
Range("A1:C13").Sort Key1:=Range("A1"), _
Order1:=xlAscending, _
Key2:=Range("B1"), _
Order1:=xlAscending, _
Header:=xlYes
As you can see in the code, you have key1 and key2. In the key1, you have the column with the employee name, and in the key2, you have the city column. For both columns, the sorting order is ascending, and headers are there.
Note: You can use it as any column you want to use to take as a sort base using the keys and order.
Changing Sort Orientation
When you normally sort data in Excel, by default, you can sort using columns. But from the sort options, you can change the sort orientation to the left to right instead of top to bottom.
In the same way, you have an argument in the sort method to change the orientation (link).
Range("A1:C13").Sort Key1:=Range("A1"), _
Order1:=xlAscending, _
Orientation:=xlSortRows
More Tutorials
- Count Rows using VBA in Excel
- Excel VBA Font (Color, Size, Type, and Bold)
- Excel VBA Hide and Unhide a Column or a Row
- Excel VBA Range – Working with Range and Cells in VBA
- Apply Borders on a Cell using VBA in Excel
- Find Last Row, Column, and Cell using VBA in Excel
- Insert a Row using VBA in Excel
- Merge Cells in Excel using a VBA Code
- Select a Range/Cell using VBA in Excel
- SELECT ALL the Cells in a Worksheet using a VBA Code
- ActiveCell in VBA in Excel
- Special Cells Method in VBA in Excel
- UsedRange Property in VBA in Excel
- VBA AutoFit (Rows, Column, or the Entire Worksheet)
- VBA ClearContents (from a Cell, Range, or Entire Worksheet)
- VBA Copy Range to Another Sheet + Workbook
- VBA Enter Value in a Cell (Set, Get and Change)
- VBA Insert Column (Single and Multiple)
- VBA Named Range | (Static + from Selection + Dynamic)
- VBA Range Offset
- VBA Wrap Text (Cell, Range, and Entire Worksheet)
- VBA Check IF a Cell is Empty + Multiple Cells
⇠ Back to What is VBA in Excel
Helpful Links – Developer Tab – Visual Basic Editor – Run a Macro – Personal Macro Workbook – Excel Macro Recorder – VBA Interview Questions – VBA Codes
Excel already has a couple of ways to sort data quickly.
You can easily sort a data set by using the sort icons in the ribbon or the sort dialog box.
Then why do you need to know how to do this using VBA?
Knowing how to sort data using VBA can be helpful when included as a part of your code. For example, suppose you get a data set daily/weekly that you need to format and sort in a specific order.
You can create a macro to do all this for you with a single click. That will save you a lot of time and effort every time you do it.
Also, if you create Excel dashboards, you can take Excel sorting capability to a new level by allowing the user to sort the data just by double-clicking on the header (as shown below).
I will cover how to create this later in this tutorial. Let’s first quickly get the basics straight.
Understanding the Range.Sort Method in Excel VBA
When sorting using VBA, you need to use the Range.Sort method in your code.
The ‘Range’ would be the data that you’re trying to sort. For example, if you’re sorting the data in A1:A10, then ‘Range’ would be Range(“A1:A10”).
You can also create a named range and use it instead of the cell references. For example, if I create a named range ‘DataRange’ for the cells A1:A10, then I can also use Range(“DataRange”)
With the sort method, you need to provide some additional information through parameters. Below are the key parameters you need to know:
- Key – here you need to specify the column that you want to sort. For example, if you want to sort column A, you need to use key:=Range(“A1”)
- Order – here you specify whether you want the sorting in an ascending order or the descending order. For example, if you want the sorting in ascending order, you will use Order:=xlAscending
- Header – here you specify whether your data set has headers or not. If it has headers, the sorting starts from the second row of the data set, else it starts from the first row. To specify that your data has headers, you will use Header:=xlYes
While these three suffices in most of the cases, you can read more about the parameters in this article.
Now let’s see how to use the Range.Sort method in VBA to sort data in Excel.
Sorting a Single Column Without Header
Suppose you have a single column without header (as shown below).
You can use the below code to sort it in ascending order.
Sub SortDataWithoutHeader() Range("A1:A12").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo End Sub
Note that I have specified the data range manually as Range(“A1:A12”).
In case there might be changes in the data and values might be added/deleted, you can use the below code that automatically adjusts based on the filled cells in the dataset.
Sub SortDataWithoutHeader() Range("A1", Range("A1").End(xlDown)).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo End Sub
Note that instead of Range(“A1:A12”), I have used, Range(“A1”, Range(“A1”).End(xlDown)).
This will check the last consecutively filled cell in the column and include it in sorting. In case there are blanks, it will only consider data till the first blank cell.
You can also create a named range and use that named range instead of the cell references. For example, if the named range is DataSet, your code would now be as shown below.
Sub SortDataWithoutHeader() Range("DataRange").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo End Sub
Now let me quickly explain the parameters used in the above examples:
- Key1:=Range(“A1”) – Specified A1 so that the code would know which column to sort.
- Order1:=xlAscending – Specified the order as xlAscending. If you want it to be in the descending order, use xlDescending.
- Header:= xlNo – Specified that there are no headers. This is also the default value. So even if you omit this, your data will be sorted considering it has no headers.
Wondering where to put this VBA code and how to run the macro? Read this tutorial!
Sorting a Single Column With Header
In the previous example, the data set did not have a header.
When your data has headers, you need to specify that in the code so that the sorting can start from the second row of the dataset.
Suppose you have a dataset as shown below:
Below is the code that will sort the data in descending order based on the sales of the stores.
Sub SortDataWithHeader() Range("DataRange").Sort Key1:=Range("C1"), Order1:=xlDescending End Sub
Note that I have created a named range – ‘DataRange’, and used this named range in the code.
Sorting Multiple Columns With Headers
So far in this tutorial, we have seen how to sort a single column (with and without headers).
Now, what if you want to sort based on multiple columns.
For example, in the below data set, what if I want to first sort by the state code, and then by the store.
Here is the code that will sort multiple columns at one go.
Sub SortMultipleColumns() With ActiveSheet.Sort .SortFields.Add Key:=Range("A1"), Order:=xlAscending .SortFields.Add Key:=Range("B1"), Order:=xlAscending .SetRange Range("A1:C13") .Header = xlYes .Apply End With End Sub
Below is the result that you will get.
In the above example, the data is first sorted by the state code (column A). Then within the state code data, it is again sorted by the Store (Column B). This order is determined by the code in which you mention it.
Sorting Data Using Double Click on Header
If you’re creating a dashboard or want more ease of use in your reports, you can write a VBA code that will sort the data when you double click on the headers.
Something as shown below:
Below is the code that will allow you to do this:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim KeyRange As Range Dim ColumnCount As Integer ColumnCount = Range("DataRange").Columns.Count Cancel = False If Target.Row = 1 And Target.Column <= ColumnCount Then Cancel = True Set KeyRange = Range(Target.Address) Range("DataRange").Sort Key1:=KeyRange, Header:=xlYes End If End Sub
Note that I have created a named range (“DataRange”) and have used it in the code instead of using the cell references.
As soon as you double-click on any of the headers, the code disables the usual double-click functionality (which is to get into the edit mode) and uses that cell as the key while sorting the data.
Also note that as of now, this code will sort all the columns in ascending order only.
Note that double-click is a trigger allows Excel to run the specified code. These triggers such as double-click, opening a workbook, adding a new worksheet, changing a cell, etc. are called events and can be used to run macros in Excel. You can read more about Excel VBA events here.
Where to put this code?
You need to paste this code into the code window of the sheet in which you want this double click sort functionality.
To do this:
- Right-click on the sheet tab.
- Click on View Code.
- Paste the code in the code window of the sheet in which your data resides.
Now what if you want to sort the first two columns (‘State’ and ‘Store’) in ascending order, but ‘Sales’ column in descending order.
Here is the code that will do it:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim KeyRange As Range Dim ColumnCount As Integer ColumnCount = Range("DataRange").Columns.Count Cancel = False If Target.Row = 1 And Target.Column <= ColumnCount Then Cancel = True Set KeyRange = Range(Target.Address) If Target.Value = "Sales" Then SortOrder = xlDescending Else SortOrder = xlAscending End If Range("DataRange").Sort Key1:=KeyRange, Header:=xlYes, Order1:=SortOrder End If End Sub
In the above code, it checks if the cell that is double-clicked is the Sales header or not. If yes, then it assigns the xlDescending value to the variable SortOrder, else it makes it xlAscending.
Now let’s take this a notch further and show a visual Marker (arrow and colored cell) in the header when it is sorted.
Something as shown below:
To get this, I have added a new worksheet and made the following changes in it (you can download the example file and follow along):
- Changed the name of the new sheet to ‘BackEnd’.
- In cell B2, entered an arrow symbol (to do this, go to Insert and click on ‘Symbol’ option).
- Copy and paste the headers from the data set to cell A3:C3 in the ‘Backend’ sheet.
- Use the following function in cell A4:AC4:
=IF(A3=$C$1,A3&" "&$B$1,A3)
- Rest of the cells will automatically get filled by the VBA code when you double click on the headers to sort the column.
Your backend sheet would look something as shown below:
Now you can use the below code to sort the data by double-clicking on the headers. When you double-click on a header, it will automatically get the arrow in the header text. Note that I have also used conditional formatting to highlight the cell as well.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim KeyRange As Range Dim ColumnCount As Integer ColumnCount = Range("DataRange").Columns.Count Cancel = False If Target.Row = 1 And Target.Column <= ColumnCount Then Cancel = True Worksheets("Backend").Range("C1") = Target.Value Set KeyRange = Range(Target.Address) Range("DataRange").Sort Key1:=KeyRange, Header:=xlYes Worksheets("BackEnd").Range("A1") = Target.Column For i = 1 To ColumnCount Range("DataRange").Cells(1, i).Value = Worksheets("Backend").Range("A4").Offset(0, i - 1).Value Next i End If End Sub
Note that this code works well for the way my data and workbook is constructed. If you change the structure of the data, you will have to modify the code accordingly.
Download the Example File
You May Also Like the Following Excel Tutorials:
- Sort Worksheets in Excel (Alphabetically)
- How to Filter Data in a Pivot Table in Excel.
- Dynamic Excel Filter Search Box – Extract Data as you Type.
- How to do a Multi-level Data Sorting in Excel.
- Excel Advanced Filter – A Complete Guide with Examples.
- 24 Useful Excel Macro Examples for VBA Beginners.
- How to Use Excel VBA InStr Function (with practical EXAMPLES).
- Excel VBA Autofilter.
How to use VBA Range.Sort Method?
This method is used to dynamically sort any particular columns in Microsoft Excel through VBA program. It depends on which columns you want to consider for sorting function and what specific cell you want to use as key or reference for sorting the data.
Syntax – expression .Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)
Range object represents a cell, row, column, selection of cells containing more than one blocks of cells.
Parameters
Name | Required/Optional | Data Type | Description |
Key1 | Optional | Variant | Specifies the first sort field, either as a range name (String) or Range object; determines the values to be sorted. |
Order1 | Optional | XlSortOrder | Determines the sort order for the values specified in Key1. |
Key2 | Optional | Variant | Second sort field; cannot be used when sorting a pivot table. |
Type | Optional | Variant | Specified which elements are to be sorted. |
Order2 | Optional | XlSortOrder | Determines the sort order for the values specified in Key2. |
Key3 | Optional | Variant | Third sort field; cannot be used when sorting a pivot table. |
Order3 | Optional | XlSortOrder | Determines the sort order for the values specified in Key3. |
Header | Optional | XlYesNoGuess | Specifies whether the first row contains header information. xlNo is the default value; specify xlGuess if you want Excel to attempt to determine the header. |
OrderCustom | Optional | Variant | Specifies a one-based integer offset into the list of custom sort orders. |
MatchCase | Optional | Variant | Set to True to perform a case-sensitive sort, False to perform non-case sensitive sort; cannot be used with pivot tables. |
Orientation | Optional | XlSortOrientation | Specifies if the sort should be in acending or decending order. |
SortMethod | Optional | XlSortMethod | Specifies the sort method. |
DataOption1 | Optional | XlSortDataOption | Specifies how to sort text in the range specified in Key1; does not apply to pivot table sorting. |
DataOption2 | Optional | XlSortDataOption | Specifies how to sort text in the range specified in Key2; does not apply to pivot table sorting. |
DataOption3 | Optional | XlSortDataOption | Specifies how to sort text in the range specified in Key3; does not apply to pivot table sorting. |
Example:
The following code will sort the data based on column labeled “Agent”. Please see figure below for the result before and after executing the sort method:
Sub Range_Sort() Dim oneRange As Range Dim aCell As Range Set sortRange = Range("F10:H15") Set keyCell = Range("G10") sortRange.Sort Key1:=keyCell, Order1:=xlAscending, Header:=xlYes End Sub
Before sort method is executedAfter sort method is executed (Highlighted in yellow indicates that the “Agent” column has been sorted)
Another example below shows how to sort a column by color index:
Sub Range_Sort_Color() ‘Variable declaration Dim iCount As Integer ‘Set the color index of column “F” from row 3 to 7 to column “H” row 3 to 7. For iCount = 3 To 7 Cells(iCount, 8) = _ Cells(iCount, 6).Interior.ColorIndex Next iCount ‘Apply the sort key defined as column H3 where the color index was stored Columns("F:I").Sort key1:=Range("H3"), _ order1:=xlAscending, Header:=xlYes End Sub
Before sort method is executed
After sort method is executed (The following figure shows the corresponding color index and the result after execution)
Depending on the data that you want to sort with different conditions, the sort method is always useful for dynamic manipulation.