Страницы: 1 2 След.
RSS
Макрос со списком сортировки
 
Добрый день! Очень нужна помощь по написанию макроса, который сортирует строки по настраиваемому списку. Собственно, есть таблица, которую нужно отсортировать по значениям двух первых столбцов. Таблица имеет вид:
ОкругФилиалПоказатель1Показатель2Показатель...
СВАО8452317
ЗАО2579811
ЦАО1734892
Принцип сортировки нужен следующий: сначала сортируем строки по первому столбцу. Сначала идут все филиалы ЦАО, затем СВАО, ВАО, ЮВАО, ЮАО, ЮЗАО и т.п. Затем сортируем по номеру филиала, по возрастанию. В результате должно получится так:
ОкругФилиалПоказатель1Показатель2Показатель...
ЦАО1734892
СВАО8452317
ЗАО2579811
Собственно, раньше для сортировки применялся еще один столбец, который попросту сопоставлял названию округа номер, для сортировки. Но нужно более изящное решение. Настраиваемые списки в самом Excel`е не очень подходят, так как с файлом работают на разных компьютерах и нет возможности каждому их настроить. Буду весьма благодарен за помощь.
 
Если сами не, то - http://www.planetaexcel.ru/forum/?PAGE_NAME=list&FID=7
Хотя можно и так (см. скрин)... ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Если просто сортировать от А до Я, то отсортирует так: ВАО, ЗАО, ЗелАО, САО, СВАО, СЗАО, ТиНАО
ЦАО, ЮАО, ЮВАО, ЮЗАО.
А нужно, чтобы получилось так: ЦАО, СВАО, ВАО, ЮВАО, ЮАО, ЮЗАО, ЗАО, СЗАО, САО, ЗелАО, ТиНАО
 
Цитата
McQueen пишет: ... А нужно, чтобы...
И что: религия не дает в доп поле перед округами поставить номера/индексы и по ним сортировать?!. ;)
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Религия-то позволяет, раньше так и было (см. последний абзац в первом сообщении темы). Нужно более изящное решение, так как строк на практике больше 300. И проставлять к ним номера несколько муторно. Хотелось-бы использовать макрос, который бы содержал список сортировки в себе или брал его из диапазона ячеек.
 
Цитата
McQueen пишет: ... Хотелось-бы использовать макрос...
Пишите, заказывайте, как минимум - ищите: сортировка данных макросом при открытии файла... ;(
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Два дня уже ищу. Такое впечатление складывается, что никто не сортирует свои данные по территориальности. Есть мысль сделать макрос с заменой округов на цифры, сортировкой и последующим возвратом исходных значений. Но это уже крайний вариант.
 
в 2003-м решается без макросов.
сервис-параметры-списки - создать новый список (ввести вручную или экспортировать из ячеек)
сортировка-параметры-сортировка по первому ключу - выбрать нужный вариант - ок, ок.

где этот функционал прячется в новых версиях - хз.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Это все понятно. Проблема в том, что такие списки надо создавать на каждом компьютере, так как они не привязаны к файлу. А это не всегда возможно.
 
Цитата
McQueen пишет: ... с заменой округов на цифры
Да все давно ук... придумано до нас - в любой стране существует индексация территориального и административного деления - от отдельного строения до града стольного...
И свой цифирный столб/поле скройте от глаз и... спите спокойно...  ;)
Изменено: Z - 18.04.2013 16:02:45
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
понятно. начинаем всё сначала.
Цитата
McQueen пишет:
Очень нужна помощь по написанию макроса
в каком виде? написать за вас? показать пример? подсказать совет? или, судя по наличию отсутствия вашего файла - вам достаточно ласкового слова и доброго взгляда?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Меня, в принципе, устроит и код макроса в виде текста, взятый из аналогичной задачи. Думаю, смогу его под себя переделать. Выкладывать файл .xls смысла не вижу: примерный образец таблицы, приведенный в первом сообщении, набивается за 1 минуту. Исходный же файл содержит кучу информации, которая к сути вопроса отношения не имеет.
 
Цитата
McQueen пишет:
Меня, в принципе, устроит
Цитата
McQueen пишет:
Выкладывать файл .xls смысла не вижу: примерный образец таблицы, приведенный в первом сообщении, набивается за 1 минуту.
поистине королевская щедрость.

у меня вопросов больше нет.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Я на этом форуме всего час, а у меня создалось стойкое впечатление, что люди здесь зарегистрировались не для того, чтобы делиться опытом, а чтобы поболтать. Буду надеяться, что тема не умрет в потоке бессмысленного флуда и найдется тот, кому моя задача покажется интересной, чтобы ее реализовать на практике.
 
Цитата
McQueen пишет: найдется тот, кому
См. пост #2... Было:
Если сами не, то - http://www.planetaexcel.ru/forum/?PAGE_NAME=list&FID=7
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Извините, что вмешиваюсь, но исключительно из желания вам помочь.
Прочитайте правила форума и сделайте так, как там написано, и вам помогут.
В противном случае, вы еще не один час проведете на форуме, объясняя завсегдатаям, как правильно помогать, но своей цели не достигнете.
 
Newbie, альтернативно одарённым людям, ищущим альтернативные способы решения своих "интересных задач", видимо, и советы нужны альтернативные.
простая логика тут не действует - проверено.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В том, что помогут я уже сомневаюсь. Тот, кто достаточно хорошо разбирается в Excel`e, понял-бы все из первого сообщения. Но пусть будет так, в порядке эксперимента выкладываю файл.
 
McQueen,и всё таки доп.столбец самое адекватное решение. Насчет набивать вручную. Зачем?
Создаём в вашем последнем файле новый столбец чтоб он был например первым. И применяем элементарную формулу:
=ПОИСКПОЗ($B3;$G$2:$G$12;0) и тянем до конца таблицы. Далее сортируем по первому столбцу!
 
На мой взгляд адекватнее макросом переименовать ЦАО в 1, СВАО в 2, ВАО в 3 и т.п., затем отсортировать по возрастанию и переименовать их в обратном порядке. Это позволит избежать дополнительного столбца, позволяет более гибко вносить изменения в таблицу и в конце-концов облегчит сам файл. Но мне думается, что должно быть решение попроще, чтобы критерии сортировки были прописаны в макросе и не было нужды в переименовании значений.
 
Ваш файл не смотрел, у меня Excel 2003
Пришлось набивать самому.
Порядок сортировки задается в столбце I
 
Спасибо, Kuzmich, это как раз то, что я искал. Правда, есть один затык: список сортировки необходимо перенести на другой лист. Пытаюсь это сделать, но получаю ошибку и остановку на 3 строке:
Run-time error '1004'
Компонент с указанным именем не найден.

Sub OrderSort()
Dim nIndex As Long
  Application.AddCustomList ListArray:=Worksheets("Техданные").[i4:i14]
   nIndex = Application.GetCustomListNum(Worksheets("Техданные").Range("I4:I14").Value)
   Range("A5:GG400").Sort Key1:=Range("B5"), Order1:=xlAscending, _
                           Header:=xlNo, Orientation:=xlSortColumns, _
                           OrderCustom:=nIndex + 1
   Range("A5:GG400").Sort Key1:=Range("A5"), Order1:=xlAscending, _
                           Header:=xlNo, Orientation:=xlSortColumns
   Application.DeleteCustomList nIndex
End Sub

Догадываюсь, что проблема в синтаксисе. Но в чем именно?
 
Путем недолгих манипуляций получился рабочий гибрид ежа с ужом:

Sub Сорт2()
Dim nIndex As Long
   Application.AddCustomList ListArray:=Array("ЦАО", "СВАО", "ВАО", "ЮВАО", "ЮАО", "ЮЗАО", "ЗАО", "СЗАО", "САО", "ЗелАО", "ТиНАО")
   nIndex = Application.GetCustomListNum(Worksheets("Техданные").Range("I4:I14").Value)
   Range("A5:GG400").Sort Key1:=Range("B5"), Order1:=xlAscending, Key2:=Range("C5"), Order1:=xlAscending, _
                           Header:=xlNo, Orientation:=xlSortColumns, _
                           OrderCustom:=nIndex + 1
   Range("A5:GG400").Sort Key1:=Range("A5"), Order1:=xlAscending, _
                           Header:=xlNo, Orientation:=xlSortColumns
   Application.DeleteCustomList nIndex
End Sub

При это, по-моему, частично теряет смысл выделенная строка. Как ее можно упростить?
 
McQueen, А Вы куда вставили код макроса? Надо в Модуль, в примере был на листе. Добавьте в редакторе VBE модуль и вставьте в него код макроса, и будет он нормально брать данные с указанного листа.
 
Спасибо, все заработало. У меня он был в модуле. Перенес его в отдельный.
 
Цитата
McQueen пишет:
Выкладывать файл .xls смысла не вижу: примерный образец таблицы, приведенный в первом сообщении, набивается за 1 минуту.
Так и "набили" бы САМИ за минуту!
Цитата
В том, что помогут я уже сомневаюсь.
А вот на "слабо" брать не стоит - не любят здесь такого...
 
Попробуйте так

Application.AddCustomList ListArray:=Worksheets("Техданные").Range("I4:I14")
nIndex = Application.GetCustomListNum(Worksheets("Техданные").Range("I4:I14").Value)
 
Юрий М - Извините, но вы как полиция в американских боевиках: появились и сказали свое веское слово когда главного злодея уже победил главный герой. Но раз уж вы здесь, будьте любезны почистить тему от постов "Z" и "ikki", как не несущих достаточной смысловой нагрузки и к решению вопроса относящиеся весьма опосредовано.

Kuzmich - Еще раз выражу свою благодарность. Выкладываю окончательный рабочий текст макроса. Думаю, кому-то наверняка еще пригодится:

Sub Сортировка()
Dim nIndex As Long
   Application.AddCustomList ListArray:=Worksheets("Техданные").[i4:i14]
   nIndex = Application.GetCustomListNum(Worksheets("Техданные").Range("I4:I14").Value)
   Range("A5:GG400").Sort Key1:=Range("B5"), Order1:=xlAscending, Key2:=Range("C5"), Order1:=xlAscending, _
                           Header:=xlNo, Orientation:=xlSortColumns, _
                           OrderCustom:=nIndex + 1
   Range("A5:GG400").Sort Key1:=Range("A5"), Order1:=xlAscending, _
                           Header:=xlNo, Orientation:=xlSortColumns
   Application.DeleteCustomList nIndex
End Sub

Igor67 - Спасибо за дельный совет, благодаря вам макрос заработал как надо.

Также выложу свой вариант с переименованием и сортировкой, может кому-то пригодится:

Sub Сортировка()
   Range("A5:A400").Select
   Selection.Replace What:="ЦАО", Replacement:="1", LookAt:=xlPart, _
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
       ReplaceFormat:=False
...
   Range("A5:GG400").Select
   Selection.Sort Key1:=Range("A5"), Order1:=xlAscending, Key2:=Range( _
       "B5"), Order2:=xlAscending, Key3:=Range("C5"), Order3:=xlAscending, _
       Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
       xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
       DataOption3:=xlSortNormal
   Range("A5:A400").Select
   Selection.Replace What:="1", Replacement:="ЦАО", LookAt:=xlPart, _
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
       ReplaceFormat:=False
...
End Sub
 
Оформляйте код тегом. А когда появляться - я сам решаю.
 
вариант

Код
Sub io()
    Dim ADO As New ADO
    
    ADO.Query "SELECT T2.F1 ", _
              "FROM [A3:C7] T1 ", _
                  "INNER JOIN [E2:F12] T2 ON T1.F1 = T2.F2"
    Range("D3").CopyFromRecordset ADO.Recordset
    
    ADO.Query "SELECT F1, F2, F3 ", _
              "FROM [A3:D7] ", _
              "ORDER BY F4, F2"
    Range("H1").CopyFromRecordset ADO.Recordset
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1 2 След.
Читают тему
Наверх