3

Я хочу иметь возможность сортировать строки 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. Сожалею.

3 ответа3

1

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

=MID(A2,9,4)

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

сортировка по вспомогательной колонке

1

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

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

0

Я знаю, что у вас есть ответ, но так как вы спросили, как это сделать с 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 - это не колокола и может не быть очень эффективно с очень большими данными)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .