Просто чтобы описать словами, я предполагаю, что у вас есть лист Excel, который выглядит примерно так:
(в этом примере видимы столбцы S и R)
Вы хотите добавить поле со списком, который будет сортировать столбцы по значению, выбранному в поле со списком, которое будет выглядеть так:
- Вариант 1 : сортировка по убыванию по столбцу R, затем S
- Вариант 2 : сортировка по убыванию по столбцу S, затем R
- Вариант 3 : сортировка по убыванию в столбце A.
Прежде всего, если вы еще не сделали этого, добавьте вкладку разработчика в Excel .
Затем поместите ячейки таблицы в именованный диапазон. Если строки в этой таблице изменятся, убедитесь, что вы создали динамический именованный диапазон . ( Динамические именованные диапазоны немного сложны, но очень полезны для динамических данных )
Добавьте поле со списком, нажав Вставить на вкладке Разработчик и выберите поле со списком из Элементы управления формой ( ПРИМЕЧАНИЕ: Поле со списком ActiveX совершенно другого типа контроля. Вы можете получить тот же результат, используя его, но код будет другим.)
Перетащите комбинированный список куда-нибудь на рабочий лист:
Теперь добавьте значения параметров в комбо. Вы должны пойти куда-нибудь в своей книге и добавить поля со списком значений для вас (например, Sheet2, Cells A1, A2 и A3).
Вернитесь на свой лист, где находятся таблица и поле со списком. Щелкните правой кнопкой мыши поле со списком и выберите Управление форматами .
Диапазон ввода должен содержать ячейки, содержащие параметры сортировки. Это выглядит примерно так: Sheet2! $ A $ 1: $ A $ 3
Снова щелкните правой кнопкой мыши поле со списком и выберите Назначить макрос . Дайте Макро имя и поместите Макрос в Эта Рабочая тетрадь
Нажмите Новый. Вы попадете в редактор Visual Basic.
Здесь вы можете применить свой код сортировки:
Option Explicit
Sub DropDown2_Change()
Dim comboValue As String
Dim Key1ColumnIndex As Integer
Dim Key2ColumnIndex As Integer
'You can get the name by doing something like this in the immediate window: "? Sheet1.Shapes(1).OLEFormat.Object.Name"
comboValue = Sheet1.Shapes("Drop Down 2").ControlFormat.List(Sheet1.Shapes("Drop Down 2").ControlFormat.ListIndex)
Select Case comboValue
Case "Option1"
Key1ColumnIndex = 18
Key2ColumnIndex = 19
Case "Option2"
Key1ColumnIndex = 19
Key2ColumnIndex = 18
Case "Option3"
Key1ColumnIndex = 1
Key2ColumnIndex = 1
End Select
Range("DataValues").Sort Key1:=Range("DataValues").Cells(1, Key1ColumnIndex), _
Order1:=xlDescending, Header:=xlNo, DataOption1:=xlSortNormal, _
Key2:=Range("DataValues").Cells(1, Key2ColumnIndex), order2:=xlDescending
End Sub
Тебе должно быть хорошо идти. Если вам нужен рабочий пример, посмотрите на образец листа, который я создал здесь ; обратите внимание, что у него нет динамического диапазона имен для таблицы.