Добрый день уважаемые форумчане, просьба в очередной раз помочь с одной задачкой
Есть лист данные, на котором представлен диапазон с кодами, который нужно отсортировать согласно заданного списка, представлен на листе список для сортировки
Как автоматизировать процесс сортировки данного диапазона при помощи VBA основанного на последовательности элементов, которая указана на листе список для сортировки? С учетом того что диапазон кодов на листе данные, не имеет определенных границ и постоянно меняется (строк может быть 100, а может быть 300)
Sub Настраиваемая_сортировка()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim arr(), strCustomOrder As String, i As Long
Set sh1 = Worksheets("данные")
Set sh2 = Worksheets("список для сортировки")
arr() = sh2.Range("A1:A" & sh2.Cells(sh2.Rows.Count, "A").End(xlUp).Row).Value
For i = 2 To UBound(arr)
strCustomOrder = strCustomOrder & arr(i, 1) & ","
Next i
strCustomOrder = Left(strCustomOrder, Len(strCustomOrder) - 1)
sh1.Sort.SortFields.Clear
sh1.Sort.SortFields.Add key:=sh1.Columns("B"), SortOn:=xlSortOnValues, Order:=xlAscending, _
CustomOrder:=CStr(strCustomOrder), DataOption:=xlSortNormal
With sh1.Sort
.SetRange sh1.Columns("B")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
End Sub
Karataev, как обычно, молодец, для общего случая отличный вариант.
pinguindell, вопрос. Если ваш код разбить на (10 и 01 , 11 и 01) в этом конкретном случае вы сортируете сперва по второй части и потом по первой, или я что-то не заметил? Если так, то не потребуется ручное заполние пользовательского листа.
Почему "вариант"? И почему "отличный"? Автор темы указал именно про сортировку с пользовательским списком, а не просил сделать сортировку на основе данных из листа. Я сделал сортировку с использованием пользовательского списка штатными средствами Excel'я. Я ничего не изобретал, а воспользовался тем, что есть.
А вот я не обратил внимание на то что порядок не совсем тот что сперва усмотрел не AB CD , а A и CD, сиртировка по A, а потом CD . Но все равно , мне кажется проще определить правило сортировки, а не руками делать список, но это не относится к теме.
БМВ, я понял, что Вы не критиковали, просто уточнил, что я не сделал ничего сверхъестественного, а просто использовал штатные средства Excel'я, поэтому не вижу смысла писать, что это "отличное" решение. Хотя сейчас посмотрел внимательнее. Автор написал про "пользовательский список", а в Excel'е в сортировке это называется "Настраиваемый список". Я подумал, что автор темы имел ввиду именно "Настраиваемый список". Возможно тогда Вы правы, что мое решение это "вариант".
pinguindell, 1. сделайте на листе с данными доп. колонку 2. в ней формулу =ПОИСКПОЗ(Значение;СписокЗначений;) 3. можете ее скрыть и сортируйте таблицу по этой колонке с полученными индексами
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
прошу прощение за поздний газ , но по ходу процесса возник еще один вопрос, если на листе данные, кроме кода есть к примеру еще другие данные, к примеру наименование (столбец С), дата (столбец D).
Как в этом случае сделать чтобы при сортировке данных сортировался не только код, но и все остальные данные. Сейчас получается что сортировка происходит только по столбцу В, а данные в столбцах C и D остаются на месте
Как обычно - толково объясняем генеральную идею замысла и ожидаемый результат, и прилагаем соответствующий правилам (пп 2.2, 2.3) файл, а не вырванные и оторванные от реальной ситуации поля/диапазоны. Поэтому-то на данный момент ваша заморочка с сортировкой, имхо, смотрится совершенно НЕ целесообразной...