Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сортировка текста с числовыми значениями - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сортировка текста с числовыми значениями (Макросы/Sub)
Сортировка текста с числовыми значениями
rever27 Дата: Среда, 24.06.2015, 17:40 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Здравствуйте. Подскажите "красивый", желательно без перебора, вариант сортировки колонок, в которых находится как текст, так и числа.
Если сортировать, как есть, то сортировка происходит только по числам с 1-9, т.е. при 3х-значном числе будет последовательность: текст=100, текст=11, текст=12 ....
Мне в голову пришел только вариант замены текста на число, и после сортировки - обратно на текст. Пример приложен.
К сообщению приложен файл: excelworld__.xlsm (25.8 Kb)
 
Ответить
СообщениеЗдравствуйте. Подскажите "красивый", желательно без перебора, вариант сортировки колонок, в которых находится как текст, так и числа.
Если сортировать, как есть, то сортировка происходит только по числам с 1-9, т.е. при 3х-значном числе будет последовательность: текст=100, текст=11, текст=12 ....
Мне в голову пришел только вариант замены текста на число, и после сортировки - обратно на текст. Пример приложен.

Автор - rever27
Дата добавления - 24.06.2015 в 17:40
KSV Дата: Среда, 24.06.2015, 18:03 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
rever27, а чем вас не устраивает ваше решение?

(можете его чуть подсократить)


[p.s.]Если нужно повысить скорость, то копировать диапазон в массив, сортировать уже сам массив, а потом выгружать его на лист, это по-любому будет "с перебором".[/p.s.]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщениеrever27, а чем вас не устраивает ваше решение?

(можете его чуть подсократить)


[p.s.]Если нужно повысить скорость, то копировать диапазон в массив, сортировать уже сам массив, а потом выгружать его на лист, это по-любому будет "с перебором".[/p.s.]

Автор - KSV
Дата добавления - 24.06.2015 в 18:03
nilem Дата: Среда, 24.06.2015, 18:19 | Сообщение № 3
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Replace для обоих столбцов, наверное, не нужен?


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеReplace для обоих столбцов, наверное, не нужен?

Автор - nilem
Дата добавления - 24.06.2015 в 18:19
Gustav Дата: Среда, 24.06.2015, 18:31 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Почему бы просто не выделить формулами числа в соседних дополнительных столбцах и уже по ним сортироваться? Типа так:
Код
=--ПСТР(X3;ПОИСК("=";X3)+1;99)

Или столбцов жалко? ;)

Или почему бы не обозвать столбцы "StopLoss" и "TakeProfit" и в них хранить уже только числа, оставшиеся после массовой замены StopLoss= и TakeProfit= на пустые строки? В чём тайный смысл хранения в ячейках постоянных текстовых префиксов перед числами?

P.S. У меня у одного спойлер не открывается? Интересно, почему... В IE11 чего-то не открывается, в Хроме открывается...


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 24.06.2015, 18:42
 
Ответить
СообщениеПочему бы просто не выделить формулами числа в соседних дополнительных столбцах и уже по ним сортироваться? Типа так:
Код
=--ПСТР(X3;ПОИСК("=";X3)+1;99)

Или столбцов жалко? ;)

Или почему бы не обозвать столбцы "StopLoss" и "TakeProfit" и в них хранить уже только числа, оставшиеся после массовой замены StopLoss= и TakeProfit= на пустые строки? В чём тайный смысл хранения в ячейках постоянных текстовых префиксов перед числами?

P.S. У меня у одного спойлер не открывается? Интересно, почему... В IE11 чего-то не открывается, в Хроме открывается...

Автор - Gustav
Дата добавления - 24.06.2015 в 18:31
Serge_007 Дата: Среда, 24.06.2015, 20:17 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
В IE11 чего-то не открывается
укоза ишака за браузер не держит ;)


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
В IE11 чего-то не открывается
укоза ишака за браузер не держит ;)

Автор - Serge_007
Дата добавления - 24.06.2015 в 20:17
rever27 Дата: Среда, 24.06.2015, 23:12 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Спасибо, Товарищи, за быстрый отклик, попробую все варианты. Gustav, Столбцов, действительно жалко, и указанные значения текста не постоянные.

KSV, Разве "перебор" увеличивает скорость в таком случае? Не подскажите, как сделать тогда сортировку в массиве, при условии, что текстовые значения всегда разные, одинаковый лишь разделитель "=". Для другого макроса вы советовали использовать: v1 = Split(Cells(i, 25), "=")
Не подскажите, как правильно сделать с разделителем массив? Скорость - наше все ))
 
Ответить
СообщениеСпасибо, Товарищи, за быстрый отклик, попробую все варианты. Gustav, Столбцов, действительно жалко, и указанные значения текста не постоянные.

KSV, Разве "перебор" увеличивает скорость в таком случае? Не подскажите, как сделать тогда сортировку в массиве, при условии, что текстовые значения всегда разные, одинаковый лишь разделитель "=". Для другого макроса вы советовали использовать: v1 = Split(Cells(i, 25), "=")
Не подскажите, как правильно сделать с разделителем массив? Скорость - наше все ))

Автор - rever27
Дата добавления - 24.06.2015 в 23:12
KSV Дата: Четверг, 25.06.2015, 01:43 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Разве "перебор" увеличивает скорость в таком случае?

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

вы советовали использовать: v1 = Split(Cells(i, 25), "=")

Я - не советовал. :) Я вам показал 2 варианта и написал, что не знаю какой из них быстрее, т.к. не тестировал.


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщение
Разве "перебор" увеличивает скорость в таком случае?

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

вы советовали использовать: v1 = Split(Cells(i, 25), "=")

Я - не советовал. :) Я вам показал 2 варианта и написал, что не знаю какой из них быстрее, т.к. не тестировал.

Автор - KSV
Дата добавления - 25.06.2015 в 01:43
rever27 Дата: Четверг, 25.06.2015, 09:37 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
KSV, Благодарю за подробный ответ. Походу, массивы и циклы мне еще учить и учить )

Решил не привязываться к тексту, поэтому сделал так:

[vba]
Код

     a = Split(Cells(ActiveCell.Row, 24), "=")(0) & "=": b = Split(Cells(ActiveCell.Row, 25), "=")(0) & "="
      
     With Range(Cells(ActiveCell.Row, 24), Cells(ActiveCell.Row, 25).End(xlDown))
         .Replace a, "11111111", xlPart: .Replace b, "22222222", xlPart
         .Sort .Columns(1)
         .Replace "11111111", a, xlPart: .Replace "22222222", b, xlPart
     End With
[/vba]
 
Ответить
СообщениеKSV, Благодарю за подробный ответ. Походу, массивы и циклы мне еще учить и учить )

Решил не привязываться к тексту, поэтому сделал так:

[vba]
Код

     a = Split(Cells(ActiveCell.Row, 24), "=")(0) & "=": b = Split(Cells(ActiveCell.Row, 25), "=")(0) & "="
      
     With Range(Cells(ActiveCell.Row, 24), Cells(ActiveCell.Row, 25).End(xlDown))
         .Replace a, "11111111", xlPart: .Replace b, "22222222", xlPart
         .Sort .Columns(1)
         .Replace "11111111", a, xlPart: .Replace "22222222", b, xlPart
     End With
[/vba]

Автор - rever27
Дата добавления - 25.06.2015 в 09:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сортировка текста с числовыми значениями (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!