Пользовательская сортировка с использованием Excel без пользовательского списка

Пользовательская сортировка с использованием Excel без пользовательского списка

Я хочу иметь возможность сортировать строки Excel, где данные выглядят так

Column - 1                 Other Columns

701-GBL-1843-MLMK          blah
566-JJB-2785-MYJW
254-WYD-3220-NAND
884-GLE-2843-FRYA

И я хочу иметь возможность сортировать данные по третьему параметру, чтобы я сравнивал по числам в середине строки, чтобы в итоге получилось что-то вроде

701-GBL-1843-MLMK
566-JJB-2785-MYJW
884-GLE-2843-FRYA
254-WYD-3220-NAND

Есть ли способ сделать это, вместо того, чтобы создавать собственный список, который будет состоять из 100000000000000 элементов?

По сути, я хочу знать, как написать код для Excel, в котором я могу сделать пользовательское сравнение, которое будет похоже на

псевдо:

mycompare(cell1, cell2):
    if(cell1's third param > cell2's third param):
        return GREATER
    if(cell1's third param < cell2's third param):
        return LESS
    return EQUAL

sort(myWorksheet, mycompare)

Излишне говорить, что я не умею программировать и использовать VB. Извините.

решение1

Создайте вспомогательный столбец. В строке 2 этого столбца (предполагая, что строка 1 имеет заголовки) введите формулу

=MID(A2,9,4)

Это извлечет «третий параметр» из значения в первом столбце. Затем отсортируем по вспомогательному столбцу:

сортировка по вспомогательному столбцу

решение2

Подход, который я бы выбрал, заключается в создании дополнительного столбца данных. Предполагая, что формат ваших значений в столбце один всегда имеет фиксированную длину, как в вашем примере, я бы использовал, =MID(A2,9,4)чтобы извлечь третий элемент в отдельную ячейку, чтобы затем можно было отсортировать по этому столбцу. Мой пример формулы выбирает 4 символа, начиная с позиции 9 символа, что, похоже, работает для показанных примеров данных.

Если вам нужна формула, которая извлекает третий элемент на основе нахождения второго и третьего тире и числа между ними, это тоже можно сделать, мне просто нужно поиграться с ней, чтобы найти кратчайший подход, но это можно сделать легко.

решение3

Я знаю, что у вас есть ответ, но раз уж вы спросили, как это сделать с помощью VBa

Option Explicit

Sub Testing()

Start (False) ' large to small
Start (True) ' small to big

End Sub

Sub Start(fromSmallToBig As Boolean)

Dim myRow As Integer
myRow = 1

Do While (Range("A" & myRow).Value <> "")

    Dim currentValue As String
    currentValue = Range("A" & myRow).Value

    Dim nextValue As String
    nextValue = Range("A" & myRow + 1).Value

    If (nextValue = "") Then
    Exit Do
    End If

    Dim first() As String
    first = Split(currentValue, "-")

    Dim second() As String
    second = Split(nextValue, "-")


    If (fromSmallToBig) Then
        Call Sorting(first(2), second(2), myRow, nextValue, currentValue)
    Else
        Call Sorting(second(2), first(2), myRow, nextValue, currentValue)
    End If

    myRow = myRow + 1

Loop

End Sub

Sub Sorting(first As String, second As String, myRow As Integer, nextValue As String, currentValue As String)

      If first > second Then

        Dim rowOne() As Variant
        rowOne = Rows(myRow).Value

        Dim rowTwo() As Variant
        rowTwo = Rows(myRow + 1).Value

        Rows(myRow).Value = rowTwo
        Rows(myRow + 1).Value = rowOne

        myRow = 0 ' start all over again, not efficient but, simpler code

    End If

End Sub

Это также означает, что вам не нужно иметь никаких дополнительных столбцов только для сортировки, хотя на самом деле это может быть не очень хорошо (ответ Скотта позволяет вам использовать мощь Excel, тогда как мой ответ на VBa бесполезен и может быть не очень эффективен с очень большими данными)

Связанный контент