Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2009, 20:27   #1
domo22
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 18
По умолчанию Сортировать иерархический список строк с пустыми ячейками

Подскажите, пожалуйста, как отсортировать иерархический (древовидный) список строк с пустыми ячейками (сначала по первому столбцу, потом по второму и т.д.).
В приведенном примере сортировать нужно только по столбцам A, B и C, но их может быть от 1 до 6. Пустые ячейки нужно сохранить - т.е. их конечно можно для правильной сортировки заполнить чем-то, но потом надо снова очистить. Знания VBA к сожалению минимальны.

Код:
Исходный список:
----A---- ----B---- ----C---- ----D------
2002 год                             высокое 
              квартал 4              среднее 
              квартал 2               в работе 
                          неделя 2    низкое 
                          неделя 1    высокое
              квартал 3               среднее 
                          неделя 2    среднее 
                          неделя 1    низкое 
                          неделя 4    высокое 
2001 год                              среднее 
              квартал 2               низкое 
                          неделя 4    нет данных 
                          неделя 1    около нуля 
2003 год                              высокое 
 
Требуемый список:

2001 год                             среднее 
             квартал 2               низкое 
                         неделя 1    около нуля 
                         неделя 4    нет данных 
2002 год                             высокое 
             квартал 2               в работе 
                        неделя 1    высокое
                        неделя 2    низкое 
             квартал 3               среднее 
                         неделя 1    низкое 
                         неделя 2    среднее 
                         неделя 4    высокое 
             квартал 4               среднее 
2003 год                             высокое
domo22 вне форума Ответить с цитированием
Старый 28.03.2009, 23:45   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Пустые ячейки нужно сохранить - т.е. их конечно можно для правильной сортировки заполнить чем-то, но потом надо снова очистить.
Скорее всего, только так и получится отсортировать...
Заполнить ячейки, в принципе, не проблема, очистить их потом - тоже.

Прикрепите файл.

Объясните, как должна осуществляться сортировка:

1 вариант: на листе 2 кнопки - заполнить и очистить. Вы нажимаете кнопку Заполнить, потом вручную сортируете как надо, после чего нажимаете Очистить

2 вариант: на листе одна кнопка - сортировать, при нажатии на которую макрос заполняет пустые поля, сортирует заранее определённым способом, и очищает нужные ячейки.
EducatedFool вне форума Ответить с цитированием
Старый 30.03.2009, 15:19   #3
domo22
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 18
По умолчанию

Цитата:
Прикрепите файл
Base_ex.zip
Цитата:
Объясните, как должна осуществляться сортировка
Конечно, более универсальный вариант предпочтительнее. Таким вроде бы выглядит вариант 1. Но главное, чтобы сортировку можно было сделать по нескольким столбцам: в одном случае - по двум, в другом - по пяти и т.д. и чтоб столбцы эти не очень сложным способом можно было указать. И еще - сортировка должна работать как минимум в Excel 2002-2003 (еще лучше - и для 97 тоже или универсальная).

А может вариант 2 все-таки лучше: указал в самом макросе сортировка прямая или обратная, задал по каким столбцам сортировать, вернулся в Excel, выделил нужный диапазон строк, нажал всего одну кнопку и готово... Но лучше было бы, чтоб и столбцы, по каким сортировать, можно было указывать из Excel, а не Бейсика...

Внимание: при заполнении пустых ячеек вручную данными из вышестоящей ячейки и стандартной сортировке (меню Данные -> Сортировка -> по возрастанию), первая строка каждой группы у меня почему-то становится последней в этой группе, что неприемлемо.

Последний раз редактировалось domo22; 30.03.2009 в 15:43.
domo22 вне форума Ответить с цитированием
Старый 30.03.2009, 16:50   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Может, как-то так?

Нажмите сначала зелёную, а потом желтую кнопочку:
Вложения
Тип файла: rar База-пример 2.rar (15.9 Кб, 218 просмотров)

Последний раз редактировалось EducatedFool; 30.03.2009 в 16:58.
EducatedFool вне форума Ответить с цитированием
Старый 30.03.2009, 19:29   #5
domo22
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 18
По умолчанию

Боже мой, программа не только правильно сортирует, она еще и элегантно оформлена! Ну это же надо! Спасибо огромное.

Но все-таки есть несколько вопросов:

1. Пожалуйста, опишите какие действия происходят при нажатии на Зеленую, Желтую и Красную кнопки. Хоть и мало знаний, но все-таки очень интересно.

2. Если галочка "Отображать пустые ячейки" снята, то можно ли чтобы программа в этом случае сохраняла исходное форматирование строк? Или даже в любом случае сохраняла? А то строки и ячейки часто раскрашены в разные цвета и все пропадает. Это возможно подправить?

3. Можно расширить помощь при нажатии на Желтую кнопку? Сейчас "Выполните сортировку через меню Excel", а сделать типа "Выделите нужный диапазон строк, а затем выполните сортировку через меню Excel. Сортировка возможна максимум по ... столбцам".

4. Длину всех трех кнопок сделать где-то на четверть меньше, они чуть длинноваты и иногда приходится тянуть ползунок, что часто неудобно.
domo22 вне форума Ответить с цитированием
Старый 31.03.2009, 05:17   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
какие действия происходят при нажатии на Зеленую, Желтую и Красную кнопки
Откройте VBA, и посмотрите код.
Там 3 макроса:
Sub ЗаполнитьПустыеЯчейки()
Sub Очистка()
Sub Сортировка()

Цитата:
можно ли чтобы программа в этом случае сохраняла исходное форматирование строк?
Конечно, можно. Достаточно убрать несколько строк.
Раскраска ячеек (фон, шрифт, и полужирное начертание) реализована исключительно для наглядности.

Цитата:
Можно расширить помощь при нажатии на Желтую кнопку?
Можно. Проблема в том, что в некоторые пустые ячейки добавляется единица, что не мешает сортировке по возрастанию. Однако при сортировке по убыванию пустые ячейки надо заполнять не единицами, а строками типа "яяя". То есть макрос перед заполнением пустых ячеек должен знать, какой столбец в каком порядке будет сортироваться.

Цитата:
Сейчас "Выполните сортировку через меню Excel", а сделать типа "Выделите нужный диапазон строк
За это отвечает строка
MsgBox "Выполните сортировку через меню Excel"
Текст можно поставить любой.

Цитата:
Длину всех трех кнопок сделать где-то на четверть меньше
Ну, с этим Вы и сами справитесь.
Выделите кнопку, удерживая клавишу Ctrl, и измените её размер (или перетащите на нужное место).
EducatedFool вне форума Ответить с цитированием
Старый 31.03.2009, 16:15   #7
domo22
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 18
По умолчанию

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

1. Прошу посмотреть исправленный код и внести правку, если нужно.
База-пример-3.zip

2. Правильно ли я понимаю, что сортировка строк возможна только если они находятся начиная с 3-й строки и расположены в 6-ти столбцах и идет она по 4-м столбцам? А иначе надо менять код? Или нет?

3. Из-за слабых знаний Бейсика мне не удалось сделать сортировку по убыванию. Можете помочь и добавить второй ряд кнопок для сортировки по убыванию?
domo22 вне форума Ответить с цитированием
Старый 01.04.2009, 03:37   #8
ing60
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 14
По умолчанию

Извините, не туда залил.
Вложения
Тип файла: rar Книга1.rar (1.7 Кб, 48 просмотров)

Последний раз редактировалось ing60; 01.04.2009 в 04:09. Причина: Извините, не туда залил.
ing60 вне форума Ответить с цитированием
Старый 05.04.2009, 11:36   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Правильно ли я понимаю, что сортировка строк возможна только если они находятся начиная с 3-й строки и расположены в 6-ти столбцах и идет она по 4-м столбцам? А иначе надо менять код? Или нет?
Сделать можно всё, в том числе и сортировку самыми разными способами.
Вот только в связи с особенностями структуры исходных данных придётся задавать сортировку по всем столбцам, начиная с первого, и заканчивая последним столбцом, требующим сортировки.

К примеру, надо отсортировать таблицу по 4-му столбцу (в данном случае неважно, по возрастанию или по убыванию).
Для этого мы во избежание перемешивания строк вынуждены задать сортировку не только по 4-му столбцу, а по всем столбцам, начиная с первого, и заканчивая 4-м.

И всё бы хорошо, но у меня не установлен Excel 2007... а 2003-я версия не позволяет задать более 3 уровней сортировки:
Цитата:
В Office Excel 2007 с помощью расширенных средств сортировки и фильтрации можно быстро представить данные в листе таким образом, чтобы получить нужные ответы. Например, теперь можно сортировать данные по цветам и по большему, чем 3 (вплоть до 64), количеству уровней. Можно также фильтровать данные по цветам или датам, отображать более 1000 элементов в раскрывающемся списке «Автофильтр», выделять несколько элементов для фильтрации и фильтровать данные в сводных таблицах.
Поэтому я не могу предложить Вам универсального решения задачи средствами Excel 2003.


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

2) Уже после этого выбора пользователь нажимает зелёную кнопку для заполнения таблицы (пустые ячейки в каждом столбце теперь заполняются значениями "1" или "яяя" - в зависимости от режима сортировки в текущем столбце)

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

Но, повторюсь, Excel 2007 у меня не установлен, поэтому реализовать и проверить макрос я не могу.



Ну а то, что строго заданы диапазоны ячеек:
Код:
Const ДиапазонДляЗаполнения = "a:d"
Const ДиапазонДляСортировки = "a:f"

sh.[3:65000]
так это не проблема (это было сделано лишь в качестве примера)

Макрос легко может определить границы таблицы (если Вы укажете критерии), и, соответственно, осуществлять обработку нужного диапазона.
EducatedFool вне форума Ответить с цитированием
Старый 05.04.2009, 13:37   #10
domo22
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 18
По умолчанию

Спасибо за пояснения, хотя мне еще не все понятно.
Цитата:
И всё бы хорошо, но у меня не установлен Excel 2007... а 2003-я версия не позволяет задать более 3 уровней сортировки:
Поэтому я не могу предложить Вам универсального решения задачи средствами Excel 2003.
Так у меня же тоже excel-2003, об этом написано сразу в первом сообщении. В нем для, например, 5-ти колоночной сортировки сначала надо сортировать по пятому столбцу, затем по четвертому, затем одновременно по первону, второму, третьему.

Цитата:
1) Во второй (пустой) строке листа пользователь для каждого столбца (или только для некоторых столбцов) выбирает режим сортировки неважно, как именно
Так вот это мне и непонятно - как именно - пользователю поставить там в каждом столбце например цифры 1,0,-1 (по возрастанию, никак, по убыванию) и в макросе реализовать анализ этих цифр или как? Но это же надо изменять макрос или нет? Сомневаюсь, что я смогу без Вашей помощи это сделать.
Цитата:
Excel 2007у меня не установлен, поэтому реализовать и проверить макрос я не могу
А и не надо на 2007. На 2003 - более-менее приемлемый вариант (максимум 6 столбцов, обычно 2-4, нельзя 6 - значит 3), такое можно?
Цитата:
Макрос легко может определить границы таблицы (если Вы укажете критерии)
А как эти критерии указывать? В самом макросе, или не трогая макрос а выделяя мышкой, или как?
domo22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с объединенными ячейками tae1980 Microsoft Office Excel 6 13.02.2009 22:25
delphi и excel работа с ячейками Doget Помощь студентам 1 04.08.2008 08:13
Сформировать список строк L1, считав его из файла input.txt Gaika Помощь студентам 4 03.07.2008 07:33
Как сортировать список TListView по определённому столбцу? Никки Общие вопросы Delphi 1 18.12.2007 19:18
Надо в RichEdit Удалить все строки между двумя пустыми Stas))) Компоненты Delphi 7 28.05.2007 16:49