Vba excel sort key1

Сортировка данных в таблице на рабочем листе 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

  1. Use the range object to specify the range that you wish to sort.
  2. Type a dot and enter the sort method.
  3. Specify the key that you want to use to sort.
  4. Define the sorting order.
  5. 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.

    Sort Data options in the ribbon

    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).

    Sort Data Using VBA - Double Click Demo

    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).

    Data for sorting with VBA - without headers single column

    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:

    Dataset to sort data using VBA in Excel

    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.

    Dataset to sort data using VBA in Excel

    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.

    Sorting Multiple Columns Using VBA

    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:

    Sort Data with VBA in Excel Using Double Click

    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:

    Sort Data Using VBA - Double Click Demo

    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:

    Sort Data using VBA - Backend for double click with arrow

    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?

    Apr 03, 2017 in Excel

    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.

    Понравилась статья? Поделить с друзьями:
  • Vba excel replace in string
  • Vba excel soap запрос
  • Vba excel repeat until
  • Vba excel smart table
  • Vba excel refresh all connections