Excel макрос для сортировки таблицы

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

Save a macro file in Excel

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

Sort Multiple Columns VBA

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.

Code to sort columns across multiple sheets in Excel VBA

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

Sort and paste data into a new sheet

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.

7 / 7 / 2

Регистрация: 16.10.2010

Сообщений: 74

1

Макрос сортировки по возрастанию построчно в области

04.05.2012, 09:34. Показов 18340. Ответов 7


Студворк — интернет-сервис помощи студентам

Ребята выручайте — нужно составить макрос EXCEL для построчной сортировки — к примеру есть некая матрица(область) данных из 3 строк и 5 столбцов

…………..
0 12 4 8 9
3 6 2 14 7
18 5 9 0 4
………….

нужно осторитровать по возрастанию в каждой строке

…………..
0 4 8 9 12
2 3 6 7 14
0 4 5 9 18
…………..

Нужен ИМЕННО макрос , т.к. я собираюсь его применить для отчета >1000 строк, там мне нужно статические данные отображать по возрастанию в каждой строке



0



956 / 596 / 11

Регистрация: 11.06.2010

Сообщений: 1,345

04.05.2012, 09:40

2

Цитата
Сообщение от whizzkey
Посмотреть сообщение

Нужен ИМЕННО макрос , т.к. я собираюсь его применить для отчета >1000 строк, там мне нужно статические данные отображать по возрастанию в каждой строке

Повторюсь: Для листа xlsx в миллион с лишним строк это занимает не более 2-х секунд



0



43 / 43 / 0

Регистрация: 04.05.2012

Сообщений: 205

04.05.2012, 09:58

3

Воспользуйтесь функцией «Записать макрос» с последующей коррекцией.
Начать запись макроса
1. Выделяете 1-ю строку(либо всю область).
2. Копируете
3.Вставляете на новый лист через специальную вставку с транспонированием.
4.Сортируете первый столбец по возрастанию.
Остановить запись макроса
Организовать цикл по перебору слолбцов с включением в цикл п.4.

Как вариант можно п1-3 сделать вручную.
Макрос записать только для п4 и организовать цикл по перебору слолбцов .
Сами справитесь?)



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.05.2012, 10:36

4

Отставить транспонирование Можно сортировать строки. Для выделенного диапазона:

Visual Basic
1
2
3
4
5
6
Sub bb()
Dim r As Object
For Each r In Selection.Rows
    r.Sort r, xlAscending, Header:=xlNo, Orientation:=xlSortRows
Next
End Sub



1



7 / 7 / 2

Регистрация: 16.10.2010

Сообщений: 74

04.05.2012, 11:26

 [ТС]

5

Спасибо огромное, работает! можно закрывать тему



0



dvzkem

0 / 0 / 0

Регистрация: 13.01.2016

Сообщений: 3

22.02.2016, 14:26

6

Люди добрые, выручайте. В макросах полный ноль. Задачка на 1 класс, но сделать не могу.

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

Вот код макроса для одного столбца.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Макрос9()
'
' Макрос9 Макрос
'
' Сочетание клавиш: Ctrl+й
'
    Columns("B:B").Select
    ActiveWorkbook.Worksheets("Лист18").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист18").Sort.SortFields.Add Key:=Range("B1"), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Лист18").Sort
        .SetRange Range("B2:B103")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

22.02.2016, 15:09

7

dvzkem, для всех столбцов в использованном диапазоне текущего листа

Visual Basic
1
2
3
4
5
6
7
8
Sub dv()
Dim c As Range
  Application.ScreenUpdating = False
  For Each c In ActiveSheet.UsedRange.Columns
    c.Sort c.Cells(1), Header:=xlNo
  Next
  Application.ScreenUpdating = True
End Sub

И отпишитесь тут: Макросы в эксель по сортировке таблиц



0



dvzkem

0 / 0 / 0

Регистрация: 13.01.2016

Сообщений: 3

22.02.2016, 18:48

8

Казанский, спасибо за ответ.
Ваш способ работает.

Я решил задачу иным способом:

Visual Basic
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
Sub Сортировка()
'
' Макрос9 Макрос
'
' Сочетание клавиш: Ctrl+й
'
Dim i As Integer, j As Integer
Dim rng As Range
 
For i = 2 To 7000
    Columns(i).Select
    Set rng = Selection
    ActiveWorkbook.Worksheets("Лист18").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист18").Sort.SortFields.Add Key:=rng, _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Лист18").Sort
        .SetRange rng
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
Next i
 
End Sub



0



Содержание

  1. Метод Range.Sort (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Пример
  6. Поддержка и обратная связь
  7. VBA Excel. Сортировка таблицы (диапазона)
  8. Синтаксис сортировки
  9. Расшифровка кода
  10. Примеры сортировки
  11. Таблица для примеров
  12. Сортировка по одному столбцу
  13. Как отсортировать данные в Excel с помощью VBA (пошаговое руководство)
  14. Понимание метода Range.Sort в Excel VBA
  15. Сортировка одного столбца без заголовка
  16. Сортировка одного столбца с заголовком
  17. Сортировка нескольких столбцов с заголовками
  18. Сортировка данных с помощью двойного щелчка по заголовку

Метод Range.Sort (Excel)

Сортирует диапазон значений.

Синтаксис

expression. Сортировка (Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)

выражение: переменная, представляющая объект Range.

Параметры

Имя Обязательный или необязательный Тип данных Описание
Key1 Необязательный Variant Указывает первое поле сортировки в виде имени диапазона (String) или объекта Range ; определяет отсортированные значения.
Order1 Необязательный XlSortOrder Определяет порядок сортировки для значений, указанных в Key1.
Key2 Необязательный Variant Второе поле сортировки; не может использоваться при сортировке сводной таблицы.
Type Необязательный Variant Указывает, какой тип элементов следует отсортировать в сводной таблице. Укажите xLSortLabels для сортировки по меткам, предназначенным для диапазонаexperession в областях Метки строк или колумов в диапазоне сводной таблицы, или xLSortValues, если Key1 дополнительно ориентируется на ячейку в областях Значений или Под/итоговых значений с помощью нотации R1C1.
Order2 Необязательный XlSortOrder Определяет порядок сортировки для значений, указанных в Key2.
Key3 Необязательный Variant Третье поле сортировки; не может использоваться при сортировке сводной таблицы.
Заказ3 Необязательный XlSortOrder Определяет порядок сортировки для значений, указанных в Key3.
Header Необязательный XlYesNoGuess Указывает, содержит ли первая строка сведения о заголовке. xlNo — значение по умолчанию; укажите xlGuess, если вы хотите, чтобы Excel попытался определить заголовок.
OrderCustom Необязательный Variant Задает одночисленное смещение в списке настраиваемых заказов сортировки.
MatchCase Необязательный Variant Задайте значение True , чтобы выполнить сортировку с учетом регистра, значение False — для сортировки без учета регистра; не может использоваться со сводными таблицами.
Orientation Необязательный XlSortOrientation Указывает, должна ли сортировка выполняться по строке (по умолчанию) или столбцу. Задайте для xlSortColumns значение 1, чтобы сортировать по столбцам. Задайте значение xlSortRows равным 2, чтобы сортировать по строкам (это значение по умолчанию).
SortMethod Необязательный XlSortMethod Указывает метод сортировки.
DataOption1 Необязательный XlSortDataOption Указывает, как сортировать текст в диапазоне, указанном в Key1; не применяется к сортировке сводной таблицы.
DataOption2 Необязательный XlSortDataOption Указывает способ сортировки текста в диапазоне, указанном в Key2; не применяется к сортировке сводной таблицы.
DataOption3 Необязательный XlSortDataOption Указывает способ сортировки текста в диапазоне, указанном в Key3; не применяется к сортировке сводной таблицы.

Возвращаемое значение

Пример

В этом примере возвращается значение цвета ячейки в столбце A с помощью свойства ColorIndex , а затем используется это значение для сортировки диапазона по цвету.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Сортировка таблицы (диапазона)

Сортировка данных в таблице на рабочем листе Excel средствами VBA. Sort и SortField, объекты и методы. Примеры сортировки данных в диапазоне.

Синтаксис сортировки

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

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

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

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

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

2. .SortFields.Clear – метод SortFields объекта Sort возвращает коллекцию объектов SortFields. Метод Clear объекта SortFields удаляет все существующие объекты 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 для сортировки диапазона по первому столбцу с параметрами по умолчанию:

Источник

Как отсортировать данные в Excel с помощью VBA (пошаговое руководство)

В Excel уже есть несколько способов быстрой сортировки данных.

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

Тогда зачем вам знать, как это сделать с помощью VBA?

Знание того, как сортировать данные с помощью VBA, может быть полезным, если оно включено в ваш код. Например, предположим, что вы получаете набор данных ежедневно / еженедельно, который необходимо отформатировать и отсортировать в определенном порядке.

Вы можете создать макрос, который сделает все это за вас одним щелчком мыши. Это сэкономит вам много времени и усилий каждый раз, когда вы будете это делать.

Кроме того, если вы создаете информационные панели Excel, вы можете вывести возможности сортировки Excel на новый уровень, позволив пользователю сортировать данные, просто дважды щелкнув заголовок (как показано ниже).

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

Понимание метода Range.Sort в Excel VBA

При сортировке с использованием VBA вам необходимо использовать в своем коде метод Range.Sort.

«Диапазон» — это данные, которые вы пытаетесь отсортировать. Например, если вы сортируете данные в формате A1: A10, тогда «Диапазон» будет иметь значение «Диапазон» («A1: A10»).

Вы также можете создать именованный диапазон и использовать его вместо ссылок на ячейки. Например, если я создаю именованный диапазон «DataRange» для ячеек A1: A10, я также могу использовать Range («DataRange»).

С помощью метода сортировки вам необходимо предоставить дополнительную информацию через параметры. Ниже приведены ключевые параметры, которые вам необходимо знать:

  • Ключ — здесь нужно указать столбец, который нужно отсортировать. Например, если вы хотите отсортировать столбец A, вам нужно использовать ключ: = Range («A1»)
  • Заказ — здесь вы указываете, хотите ли вы сортировку по возрастанию или по убыванию. Например, если вам нужна сортировка по возрастанию, вы должны использовать Order: = xlAscending
  • Заголовок — здесь вы указываете, есть ли у вашего набора данных заголовки или нет. Если у него есть заголовки, сортировка начинается со второй строки набора данных, иначе она начинается с первой строки. Чтобы указать, что у ваших данных есть заголовки, вы будете использовать Header: = xlYes

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

Теперь давайте посмотрим, как использовать метод Range.Sort в VBA для сортировки данных в Excel.

Сортировка одного столбца без заголовка

Предположим, у вас есть один столбец без заголовка (как показано ниже).

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

Обратите внимание, что я указал диапазон данных вручную как Range («A1: A12»).

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

Обратите внимание, что вместо Range («A1: A12») я использовал Range («A1», Range («A1»). End (xlDown)).

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

Вы также можете создать именованный диапазон и использовать этот именованный диапазон вместо ссылок на ячейки. Например, если именованный диапазон — DataSet, ваш код теперь будет таким, как показано ниже.

Теперь позвольте мне быстро объяснить параметры, используемые в приведенных выше примерах:

  • Key1: = Range («A1») — указывает A1, чтобы код знал, какой столбец сортировать.
  • Order1: = xlAscending — Указан порядок как xlAscending. Если вы хотите, чтобы он располагался в порядке убывания, используйте xlDescending.
  • Заголовок: = xlNo — указывает, что заголовков нет. Это также значение по умолчанию. Таким образом, даже если вы опустите это, ваши данные будут отсортированы, учитывая, что у них нет заголовков.

Не знаете, где разместить этот код VBA и как запустить макрос? Прочтите это руководство!

Сортировка одного столбца с заголовком

В предыдущем примере у набора данных не было заголовка.

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

Предположим, у вас есть набор данных, как показано ниже:

Ниже приведен код, который сортирует данные в порядке убывания продаж в магазинах.

Обратите внимание, что я создал именованный диапазон — DataRange и использовал этот именованный диапазон в коде.

Сортировка нескольких столбцов с заголовками

До сих пор в этом руководстве мы видели, как отсортировать отдельный столбец (с заголовками и без них).

А что, если вы хотите отсортировать по нескольким столбцам.

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

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

Ниже представлен результат, который вы получите.

В приведенном выше примере данные сначала сортируются по коду состояния (столбец A). Затем в данных кода состояния он снова сортируется по магазину (столбец B). Этот порядок определяется кодом, в котором вы его упоминаете.

Сортировка данных с помощью двойного щелчка по заголовку

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

Что-то вроде того, что показано ниже:

Ниже приведен код, который позволит вам это сделать:

Обратите внимание, что я создал именованный диапазон («DataRange») и использовал его в коде вместо использования ссылок на ячейки.

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

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

Обратите внимание, что двойной щелчок — это триггер, позволяющий Excel запускать указанный код. Эти триггеры, такие как двойной щелчок, открытие книги, добавление нового рабочего листа, изменение ячейки и т. Д., Называются событиями и могут использоваться для запуска макросов в Excel. Вы можете узнать больше о событиях Excel VBA здесь.

Куда поставить этот код?

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

  • Щелкните правой кнопкой мыши вкладку листа.
  • Щелкните Просмотреть код.
  • Вставьте код в окно кода листа, на котором находятся ваши данные.

А что, если вы хотите отсортировать первые два столбца («Штат» и «Магазин») в порядке возрастания, а столбец «Продажи» — в порядке убывания.

Вот код, который это сделает:

В приведенном выше коде он проверяет, является ли ячейка, по которой дважды щелкнули, заголовком Продажи или нет. Если да, то он присваивает значение xlDescending переменной SortOrder, иначе делает его xlAscending.

Теперь давайте сделаем еще один шаг вперед и покажем визуальный маркер (стрелка и цветная ячейка) в заголовке при сортировке.

Что-то вроде того, что показано ниже:

Чтобы получить это, я добавил новый рабочий лист и внес в него следующие изменения (вы можете загрузить файл примера и следить за ним):

  • Изменил имя нового листа на «BackEnd».
  • В ячейке B2 введите символ стрелки (для этого перейдите во вкладку «Вставить» и выберите параметр «Символ»).
  • Скопируйте и вставьте заголовки из набора данных в ячейку A3: C3 на листе «Backend».
  • Используйте следующую функцию в ячейке A4: AC4:
  • Остальные ячейки будут автоматически заполнены кодом VBA, если вы дважды щелкните заголовки, чтобы отсортировать столбец.

Ваш внутренний лист будет выглядеть примерно так, как показано ниже:

Теперь вы можете использовать приведенный ниже код для сортировки данных, дважды щелкнув заголовки. Если дважды щелкнуть заголовок, в тексте заголовка автоматически появится стрелка. Обратите внимание, что я также использовал условное форматирование, чтобы выделить ячейку.

Обратите внимание, что этот код хорошо подходит для построения моих данных и книги. Если вы измените структуру данных, вам придется соответствующим образом изменить код.

Источник

Макрос-сортировка столбца

wwizard

Дата: Вторник, 10.01.2017, 13:04 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

Добрый день.
Можно придумать маленьки макрос, который бы просто сортировал, всю таблицу, по примеру кнопки на панели?
Т.е. — есть огромная таблица, нужно ее постоянно сортировать по 8му столбцу и по 10му.

Т.е. сначала столбец № 8, потом столбец №10

[vba]

Код

Sub Сортировка строк по данным в столбце 8()
    Range(«A3:F26»).Sort Key1:=Range(«C3»), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End Sub

[/vba]

Пробовал по этому примеру, ничего не получилось

 

Ответить

Pelena

Дата: Вторник, 10.01.2017, 13:11 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
Макрорекодер записал так в Вашем примере
[vba]

Код

Sub Макрос1()

‘ Макрос1 Макрос


    ActiveWorkbook.Worksheets(«Лист1»).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(«Лист1»).Sort.SortFields.Add Key:=Range(«H2:H5»), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets(«Лист1»).Sort.SortFields.Add Key:=Range(«K2:K5»), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(«Лист1»).Sort
        .SetRange Range(«A1:K5»)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Wasilich

Дата: Среда, 11.01.2017, 10:48 |
Сообщение № 3

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

А у меня так
[vba]

Код

Sub Кнопка1_Щелкнуть()

‘ Кнопка1_Щелкнуть Макрос

    Range(«A2:R5»).Select
    Selection.Sort Key1:=Range(«H2»), Order1:=xlAscending, Key2:=Range(«J2») _
        , Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
        xlSortNormal
End Sub

[/vba]

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 12:39 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

Странно — у меня ни один не заработал

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 12:50 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

Вот так это выглядит до: http://prntscr.com/du6k09
Любой из этих макросов, как и мой — записаный рекордером, делает — обратное. Часть строк остается, и сортирются только значения в столбцах. А нужно, чтобы все значения переставлялись, как еслибы я делал так:http://prntscr.com/du6l3a
А сейчас я получаю, после запуска любого из этих, или свой макрос, это: http://prntscr.com/du6llj — но оно неверно.

К сообщению приложен файл:

12.xlsm
(13.8 Kb)

Сообщение отредактировал wwizardСреда, 11.01.2017, 12:50

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 13:01 |
Сообщение № 6

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

Разобрался. Один вопрос, как вместо:

[vba]

[/vba]

K33 — поставить до конца листа?

 

Ответить

китин

Дата: Среда, 11.01.2017, 13:03 |
Сообщение № 7

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

bmv98rus

Дата: Среда, 11.01.2017, 13:31 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

wwizard,

та может надо просто столбцы указать от и до и Header = xlYes в примере то заголовак в первой строке

код от Wasilich, но не проверял именно этот
[vba]

Код

Sub Кнопка1_Щелкнуть()

‘ Кнопка1_Щелкнуть Макрос

    Range(«A:R»).Select
    Selection.Sort Key1:=Range(«H:H»), Order1:=xlAscending, Key2:=Range(«j;J») _
        , Order2:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
        xlSortNormal
End Sub

[/vba]


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rusСреда, 11.01.2017, 13:35

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 13:42 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

[vba]

Код

Sub Макрос1цуцуцуцуцу()

‘ Макрос1цуцуцуцуцу Макрос

    Cells.Select
    ActiveWorkbook.Worksheets(«Лист1»).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(«Лист1»).Sort.SortFields.Add Key:=Range(«H:H»), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets(«Лист1»).Sort.SortFields.Add Key:=Range(«J:J»), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(«Лист1»).Sort
        .SetRange Range(«A1:K»)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range(«I19»).Select
End Sub

[/vba]

Не заработало

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 13:45 |
Сообщение № 10

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

[vba]

Код

Range(«A1:K» & Cells(Rows.Count, 1).End(xlUp).Row).Select

[/vba]
И если первую вставляю такую — то тоже не работает

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 13:53 |
Сообщение № 11

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

В общем не получается, не понимаю.

[vba]

Код

ub æ_Ìàêðîñ_ñîðòèðîâêà()

    Cells.Select
    ActiveWorkbook.Worksheets(«Ëèñò1»).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(«Ëèñò1»).Sort.SortFields.Add Key:=Range(«H2:H»)
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets(«Ëèñò1»).Sort.SortFields.Add Key:=Range(«K2:K»)
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(«Ëèñò1»).Sort
        .SetRange Range(«A1:K» & lr).Value
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

[/vba]

Сообщение отредактировал wwizardСреда, 11.01.2017, 13:53

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 13:54 |
Сообщение № 12

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

та может надо просто столбцы указать от и до и Header = xlYes в примере то заголовак в первой строке

Можете указать в файле пример, бо у меня не заработало — чтото догнать не могу

 

Ответить

bmv98rus

Дата: Среда, 11.01.2017, 15:06 |
Сообщение № 13

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

wwizard,
из рекордера по быстромую
[vba]

Код

Sub Macro1()

    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range(«H:H»), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=Range(«J:J»), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range(«A:K»)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

[/vba]


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rusСреда, 11.01.2017, 15:28

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 17:11 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

Так в томто и дело, что по быстрому не интересно. Интересно разобратся, а спросить совета было не у кого.

 

Ответить

wwizard

Дата: Среда, 11.01.2017, 17:21 |
Сообщение № 15

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 174

К примеру:

[vba]

Код

Sub Пересчет_цены_с_курса()

    ActiveCell.FormulaR1C1 = «=RC[1]/R[-1]C»
    Range(«E2»).Select
    Selection.AutoFill Destination:=Range(«E2:E27»)
    Range(«E2:E27»).Select
    Columns(«E:E»).Select
    Selection.NumberFormat = «0.0_ ;[Red]-0.0 «
    Range(«E22»).Select
End Sub

[/vba]

Тут он берет по 27 строку. Вот как сделать чтобы определял количество заполненных строк например по первой колонке, и считал только при этом?

 

Ответить

bmv98rus

Дата: Среда, 11.01.2017, 17:26 |
Сообщение № 16

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

Wasilich

Дата: Среда, 11.01.2017, 20:01 |
Сообщение № 17

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

как сделать чтобы определял количество заполненных строк например по первой колонке

Да уж, никто не поймет что вам надо.
Количество заполненных строк по первой колонке. (только заполненных, без учета пустых). Только не понятно зачем это для сортировки
[vba]

Код

KZS = WorksheetFunction.CountA(Columns(1))

[/vba]
Надо то, последняя заполненная строка (по первой колонке)
[vba]

Код

PZS = Range(«A» & Rows.Count).End(xlUp).Row
PZS = Cells(Rows.Count, 1).End(xlUp).Row
PZS  = Columns(1).SpecialCells(xlCellTypeLastCell).Row

[/vba]А в коде так
[vba]

Код

Sub Кнопка1_Щелкнуть()
    PZS = Range(«A» & Rows.Count).End(xlUp).Row
    Range(«A2:R» & PZS).Sort Key1:=Range(«H2»), Order1:=xlAscending, Key2:=Range(«J2») _
        , Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
        xlSortNormal
End Sub

[/vba]
Или Вам нужна раздельная сортировка по Н и по J. Вразумите нас.

Сообщение отредактировал WasilichСреда, 11.01.2017, 20:05

 

Ответить

DrMini

Дата: Воскресенье, 02.07.2017, 13:00 |
Сообщение № 18

Группа: Проверенные

Ранг: Старожил

Сообщений: 1019


Репутация:

93

±

Замечаний:
0% ±


Excel LTSC 2021 RUS


Доброго времени суток. Искал сортировку таблицы макросом и «набрёл» на эту тему. Я своим скудным умишком вроде домыслил, как применить это для себя ЛИСТ «Таблица» .Но не нравится, что после работы макроса все ячейки обработанные макросом становятся выделенными. Помогите исправить.

 

Ответить

Pelena

Дата: Воскресенье, 02.07.2017, 13:07 |
Сообщение № 19

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Просто добавьте в конец макроса активацию какой-нибудь ячейки, например,
[vba][/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

RAN

Дата: Воскресенье, 02.07.2017, 13:10 |
Сообщение № 20

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Достаточно просто удалить слова Select и Selection.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Excel макрос для рисунка
  • Excel макрос для разных файлов
  • Excel макрос для примечания
  • Excel макрос для построения диаграммы
  • Excel макрос для построения графиков