Здравствуйте. Подскажите "красивый", желательно без перебора, вариант сортировки колонок, в которых находится как текст, так и числа. Если сортировать, как есть, то сортировка происходит только по числам с 1-9, т.е. при 3х-значном числе будет последовательность: текст=100, текст=11, текст=12 .... Мне в голову пришел только вариант замены текста на число, и после сортировки - обратно на текст. Пример приложен.
Здравствуйте. Подскажите "красивый", желательно без перебора, вариант сортировки колонок, в которых находится как текст, так и числа. Если сортировать, как есть, то сортировка происходит только по числам с 1-9, т.е. при 3х-значном числе будет последовательность: текст=100, текст=11, текст=12 .... Мне в голову пришел только вариант замены текста на число, и после сортировки - обратно на текст. Пример приложен.rever27
Sub b_Sort_X() 'Сортировка по столбцу X b_Sort 1 End Sub
Sub b_Sort_Y() 'Сортировка по столбцу Y b_Sort 2 End Sub
Sub b_Sort(ByVal ColumnNum As Long) With Range(Cells(ActiveCell.Row, 24), Cells(ActiveCell.Row, 25).End(xlDown)) .Replace "StopLoss=", "11111111", xlPart .Replace "TakeProfit=", "22222222", xlPart 'On Error Resume Next .Sort .Columns(ColumnNum) .Replace "11111111", "StopLoss=", xlPart .Replace "22222222", "TakeProfit=", xlPart End With End Sub
[/vba]
[p.s.]Если нужно повысить скорость, то копировать диапазон в массив, сортировать уже сам массив, а потом выгружать его на лист, это по-любому будет "с перебором".[/p.s.]
rever27, а чем вас не устраивает ваше решение?
(можете его чуть подсократить)
[vba]
Код
Sub b_Sort_X() 'Сортировка по столбцу X b_Sort 1 End Sub
Sub b_Sort_Y() 'Сортировка по столбцу Y b_Sort 2 End Sub
Sub b_Sort(ByVal ColumnNum As Long) With Range(Cells(ActiveCell.Row, 24), Cells(ActiveCell.Row, 25).End(xlDown)) .Replace "StopLoss=", "11111111", xlPart .Replace "TakeProfit=", "22222222", xlPart 'On Error Resume Next .Sort .Columns(ColumnNum) .Replace "11111111", "StopLoss=", xlPart .Replace "22222222", "TakeProfit=", xlPart End With End Sub
[/vba]
[p.s.]Если нужно повысить скорость, то копировать диапазон в массив, сортировать уже сам массив, а потом выгружать его на лист, это по-любому будет "с перебором".[/p.s.]KSV
Sub b_Sort_X() 'Сортировка по столбцу X b_Sort 1, "StopLoss=" End Sub
Sub b_Sort_Y() 'Сортировка по столбцу Y b_Sort 2, "TakeProfit=" End Sub
Sub b_Sort(ByVal ColumnNum As Long, s As String) With Range(Cells(ActiveCell.Row, 24), Cells(ActiveCell.Row, 25).End(xlDown)) .Replace s, "11111111", xlPart .Sort .Columns(ColumnNum) .Replace "11111111", s, xlPart End With End Sub
[/vba]
Replace для обоих столбцов, наверное, не нужен?
[vba]
Код
Sub b_Sort_X() 'Сортировка по столбцу X b_Sort 1, "StopLoss=" End Sub
Sub b_Sort_Y() 'Сортировка по столбцу Y b_Sort 2, "TakeProfit=" End Sub
Sub b_Sort(ByVal ColumnNum As Long, s As String) With Range(Cells(ActiveCell.Row, 24), Cells(ActiveCell.Row, 25).End(xlDown)) .Replace s, "11111111", xlPart .Sort .Columns(ColumnNum) .Replace "11111111", s, xlPart End With End Sub
Почему бы просто не выделить формулами числа в соседних дополнительных столбцах и уже по ним сортироваться? Типа так:
Код
=--ПСТР(X3;ПОИСК("=";X3)+1;99)
Или столбцов жалко?
Или почему бы не обозвать столбцы "StopLoss" и "TakeProfit" и в них хранить уже только числа, оставшиеся после массовой замены StopLoss= и TakeProfit= на пустые строки? В чём тайный смысл хранения в ячейках постоянных текстовых префиксов перед числами?
P.S. У меня у одного спойлер не открывается? Интересно, почему... В IE11 чего-то не открывается, в Хроме открывается...
Почему бы просто не выделить формулами числа в соседних дополнительных столбцах и уже по ним сортироваться? Типа так:
Код
=--ПСТР(X3;ПОИСК("=";X3)+1;99)
Или столбцов жалко?
Или почему бы не обозвать столбцы "StopLoss" и "TakeProfit" и в них хранить уже только числа, оставшиеся после массовой замены StopLoss= и TakeProfit= на пустые строки? В чём тайный смысл хранения в ячейках постоянных текстовых префиксов перед числами?
P.S. У меня у одного спойлер не открывается? Интересно, почему... В IE11 чего-то не открывается, в Хроме открывается...Gustav
Спасибо, Товарищи, за быстрый отклик, попробую все варианты. Gustav, Столбцов, действительно жалко, и указанные значения текста не постоянные.
KSV, Разве "перебор" увеличивает скорость в таком случае? Не подскажите, как сделать тогда сортировку в массиве, при условии, что текстовые значения всегда разные, одинаковый лишь разделитель "=". Для другого макроса вы советовали использовать: v1 = Split(Cells(i, 25), "=") Не подскажите, как правильно сделать с разделителем массив? Скорость - наше все ))
Спасибо, Товарищи, за быстрый отклик, попробую все варианты. Gustav, Столбцов, действительно жалко, и указанные значения текста не постоянные.
KSV, Разве "перебор" увеличивает скорость в таком случае? Не подскажите, как сделать тогда сортировку в массиве, при условии, что текстовые значения всегда разные, одинаковый лишь разделитель "=". Для другого макроса вы советовали использовать: v1 = Split(Cells(i, 25), "=") Не подскажите, как правильно сделать с разделителем массив? Скорость - наше все ))rever27
Разве "перебор" увеличивает скорость в таком случае?
rever27, здесь смысл не в том, "перебор" цикл это или нет, а в том, что вы за один раз считываете данные с листа в массив (а это быстрая операция даже для больших объемов данных, т.к. это, по сути, "простое" копирование области памяти, внутренней структуры листа, в другую область памяти, на которую указывает структура SAFEARRAY, вашего массива), и дальнейшие действия (в данном случае сортировку) вы выполняете уже с массивом, т.е., в памяти, а не обращаетесь каждый раз к свойствам листа/ячеек. Вы же сами с этим недавно столкнулись вот здесь: Для меня было удивление, что вначале замена совпавших условий на текст, а потом удаление ячеек с текстовым названием занимает в разы меньше времени, чем обычное удаление. Скорость возросла именно из-за того, что вы работали с массивом, в памяти, а не из-за того, что вы меняли числовые значения на текстовые.
Разве "перебор" увеличивает скорость в таком случае?
rever27, здесь смысл не в том, "перебор" цикл это или нет, а в том, что вы за один раз считываете данные с листа в массив (а это быстрая операция даже для больших объемов данных, т.к. это, по сути, "простое" копирование области памяти, внутренней структуры листа, в другую область памяти, на которую указывает структура SAFEARRAY, вашего массива), и дальнейшие действия (в данном случае сортировку) вы выполняете уже с массивом, т.е., в памяти, а не обращаетесь каждый раз к свойствам листа/ячеек. Вы же сами с этим недавно столкнулись вот здесь: Для меня было удивление, что вначале замена совпавших условий на текст, а потом удаление ячеек с текстовым названием занимает в разы меньше времени, чем обычное удаление. Скорость возросла именно из-за того, что вы работали с массивом, в памяти, а не из-за того, что вы меняли числовые значения на текстовые.
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