Как сделать хитрую сортировку в Excel ?

Программирование на Visual Basic for Applications
DDimok
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 29.06.2004 (Вт) 14:45
Откуда: Москва

Как сделать хитрую сортировку в Excel ?

Сообщение DDimok » 03.03.2005 (Чт) 15:32

Уважаемые, возникла такая проблемка - есть на листе Экселя столбец с данными типа
2:5 , 1:18, 3:1:10, 1:7 ... (кол-во групп разделенных ":" - неизвестно)
Надо отсортировать данные по ПОСЛЕДНЕМУ числу (разделенных двоеточиями). Если писать програмулю, то я бы вытащил последние симовлы (InStrRev), переставил вперед, отсортировал, и удалил первые симовлы. А есть ли что-нить подобное в функциях самого Экселя ? Я нашел только поиск ПЕРВОГО вхождения. А как найти ПОСЛЕДНЕЕ вхождение ?
Заранее благодарен за ответы и советы :)
Дмитрий

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 03.03.2005 (Чт) 16:23

Что-то мне кажется, что, если можно, то с ОООЧЕНЬ большими извратами... Вот если бы была функция, которые строки задом наперед обращает...
Быть... или не быть. Вот. В чём вопрос?

DDimok
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 29.06.2004 (Вт) 14:45
Откуда: Москва

Сообщение DDimok » 03.03.2005 (Чт) 16:36

Задом-наперед переделать строку - тоже не поможет (тоже думал об этом). она сделает из 2:46 - 64:2 2:37- 73:2 :(
Дмитрий

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 03.03.2005 (Чт) 16:46

Это как раз было бы неважно - по переделанной задом наперед строке можно было бы найти позицию двоеточия, а дальше с ее помощью брать кусок из исходной строки. К сожалению, я не могу придумать, как без VBA обратить строку.
Быть... или не быть. Вот. В чём вопрос?

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 03.03.2005 (Чт) 18:58

DDimok
Может Я Вас не так понял, но встроенный метод есть.
Если "Надо отсортировать данные по ПОСЛЕДНЕМУ числу", то для сортировки есть автофильтр. Выбираете "Условие", далее уже в самом "Пользовательском автофильтре" выбираете "Показать только те строки значения которых"
- не заканчивается на...
- заканчивается на...
"И" , "ИЛИ"

- не заканчивается на...
- заканчивается на...

Выбор условий не вилик, но если требованний не много, то например мне для сортировки 3-4 вполне хватает. Один раз только воспользовался кодом. Кстати полсе этого нашёл ещё один стандартный способ.
Hasta la vista, baby!

DDimok
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 29.06.2004 (Вт) 14:45
Откуда: Москва

Сообщение DDimok » 03.03.2005 (Чт) 19:37

Нееее .... Вы меня видимо не поняли. то что Вы предложили - это метод ФИЛЬТРАЦИИ (отбора нужных записей). А мне нужна СОРТИРОВКА - УПОРЯДОЧИТЬ строки в нужном порядке (масло масленное :)) ).
Все равно - спасибо за внимание :)
Дмитрий

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 03.03.2005 (Чт) 20:07

Всё дошло. А я то думаю, неуж-то человек не знает. Но мало ли.
У меня такая же проблема. Но одно могу смело сказать ни в одном справочнике, даже от Микрософт такой инфы нет. Уже рылся, а один из них прочитал раза три-четыре. Следовательно можно заключить что такой функции нет.
Может в 2003 что-то добавили, но ведь ни Вы ни я ничего не заметили в этом направлении.
Может готовый файл нужен в котором есть код, я щас найду его, если да то стукни, прям сдесь повешу, тока свою инфу стереть надо. Может что интересное в нём найдёшь или наоборот мне подскажешь.
Hasta la vista, baby!

DDimok
Новичок
Новичок
 
Сообщения: 40
Зарегистрирован: 29.06.2004 (Вт) 14:45
Откуда: Москва

Сообщение DDimok » 03.03.2005 (Чт) 20:47

Спасибо, код макроса я уже сам слабал -
если потребуется - вот:


Sub hitroSort()
' сортирует лист по столбцу с данными типа 1:2, 2:16, 2:1:56, 3:6:2:9, ...
Dim vOldRow As Integer, vOldCol As Integer, vNewCol As Integer, vRow As Integer
Dim cTemp As String, i As Integer
vOldCol = Selection.Rows.Column ' колонка на которой стоим
vOldRow = Selection.Rows.Row ' строка на которой стоим
vNewCol = vOldCol + 1
Columns(vNewCol).Select
Selection.Insert Shift:=xlToRight ' вставить новую колонку
Selection.NumberFormat = "0" ' формат данных на ней - числа
Cells(vOldRow, vNewCol).Select
vRow = 0
' пройтись от первой строки до "первой пустой" строки
Do
vRow = vRow + 1
cTemp = Cells(vRow, vOldCol)
If cTemp = Empty Then
Exit Do
End If
' найти последний символ двоеточия
i = InStrRev(cTemp, ":")
If i > 0 Then
cTemp = Mid(cTemp, i + 1)
End If
Cells(vRow, vNewCol) = cTemp
Loop
''''''''''''''''''''''''''''''''''''''
' выделение всего и сортировка
Cells.Select
Selection.Sort _
Key1:=Range(Cells(1, vNewCol), Cells(1, vNewCol)), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' DataOption1:=xlSortTextAsNumbers '''' это XP-шная фича
Cells(vOldRow, vOldCol).Select
' удалить вспомогательную колонку
Columns(vNewCol).Select
Selection.Delete Shift:=xlToLeft
Cells(vOldRow, vOldCol).Select
Exit Sub
End Sub
Дмитрий


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList