Страницы: 1
RSS
Сортировка значений с опциональным тире в начале
 
Добрый день!
Возникла задача отсортировать значения столбца, наполненного по шаблону:  цифровое значение (может быть отрицательным) + произвольный текст.
При стандартной сортировке при наличии значений, например,  "01 Текст",  "02 Текст", "-1 Текст", "10 Текст", "12 Текст" и "-2 Текст" они будут отсортированны именно в таком порядке.
Подкажите, как можно сделать, чтобы при сортировке сначала выводились значения с отрицательными цифрами: "-1 Текст", "-2 Текст" ,  "01 Текст",  "02 Текст", "10 Текст", "12 Текст". Либо возможен вариант: "01 Текст",  "02 Текст", "10 Текст", "12 Текст", "-1 Текст", "-2 Текст" - главное, чтобы значения с минусом шли один за другим.


Так же приложил пример в excel.
Изменено: baza906 - 12.05.2021 10:25:06
 
baza906, здравствуйте
Цитата
baza906: сначала выводились значения с отрицательными цифрами: "-1 Текст", "-2 Текст" ,  "10 Текст", "12 Текст". Так же приложил пример в excel
не соответствует
Изменено: Jack Famous - 12.05.2021 09:43:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, здравствуйте

В приложенном эксельнике изначально указал исходные данные и результат сортировки по умолчанию:
Цитата
При стандартной сортировке при наличии значений, например, "-1 Текст", "10 Текст", "12 Текст" и "-2 Текст" они будут отсортированны именно в таком порядке.
После вашего замечания дополнил эксельник столбцом "желаемый результат", который соответсвует требованию:
Цитата
сначала выводились значения с отрицательными цифрами: "-1 Текст", "-2 Текст" ,  "10 Текст", "12 Текст".
 
Т.е. сортировка должна быть по модулю от меньшего к большему?
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
В столбец рядом и сортировка по этому столбцу:
=--ЛЕВБ(A2;ПОИСК(" ";A2)-1)
Если по модулю - добавить ABS
 
Цитата
baza906: дополнил эксельник столбцом
мало - как должен выглядеть результат, если добавить ещё как первые 3 строчки, но БЕЗ минуса
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
baza906, пока писал чет уже много обсуждений - сделал как понял.
Код
Sub mrshkei()
Dim arr, arrM, arrP, i As Long, k1 As Long, k2 As Long, sh As Worksheet
Application.ScreenUpdating = False
Set sh = ActiveSheet
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A2:A" & lr)
ReDim arrM(1 To lr, 1 To 1): ReDim arrP(1 To lr, 1 To 1)
k1 = 1: k2 = 1
For i = LBound(arr) To UBound(arr)
    If Left(arr(i, 1), 1) = "-" Then
        arrM(k1, 1) = arr(i, 1): k1 = k1 + 1
    Else
        arrP(k2, 1) = arr(i, 1): k2 = k2 + 1
    End If
Next i
ThisWorkbook.Sheets.Add After:=sh
With ActiveSheet
    .Range("A1").Resize(UBound(arrM), 1) = arrM
    .Range("B1").Resize(UBound(arrP), 1) = arrP
For i = 1 To 2
Application.DisplayAlerts = False
        .Cells(1, i).Select
    .Range(Selection, Selection.End(xlDown)).Select
    ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
    ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=.Range(.Cells(1, i), .Cells(UBound(arrM), i)), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.ActiveSheet.Sort
        .SetRange Range(Cells(1, i), Cells(UBound(arrM), i))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
End With
Next i
arrM = .Range(.Cells(1, 1), .Cells(UBound(arrM), 1))
arrP = .Range(.Cells(1, 2), .Cells(UBound(arrP), 2))
.Delete
Application.DisplayAlerts = True
End With
sh.Activate
Cells(2, 1).Resize(UBound(arrM), 1) = arrM: Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(UBound(arrP), 1) = arrP
Application.ScreenUpdating = True
End Sub
Изменено: Mershik - 12.05.2021 10:11:01
Не бойтесь совершенства. Вам его не достичь.
 
Jack Famous, в этом случае первым символом будет ноль, это действительно нужно было указать, не подумал.
Текст сообщения и эксельник, теперь там полный домен данных.
впринципе, единственное требование - чтобы отрицательные значения шли один за другим
 
в столбце рядом и по нему сорт -не работает del
Код
=КОДСИМВ(A2)
Изменено: Тимофеев - 12.05.2021 10:35:12
 
Максим В., впринципе, главное - чтобы отрицательные значения шли один за другим. других требований поданным нет, следующий приоритет - простота решения
 
Да в сообщении №5 давно уже ржавеет формула... Без сортировки - сообщение №9
 
Метода из сообщения 9 будет достаточно
Всем большое спасибо за варианты и ответы!
Страницы: 1
Наверх