Sortowanie niestandardowe przy użyciu programu Excel bez listy niestandardowej

3

Chcę mieć możliwość sortowania wierszy programu Excel, w których wyglądają dane

Column - 1                 Other Columns

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

I chcę móc sortować dane według trzeciego parametru, aby porównać je według liczb w środku łańcucha, aby skończyć jak

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

Czy istnieje sposób, aby to zrobić, zamiast tworzyć niestandardową listę o długości 100000000000000 elementów

Zasadniczo chcę wiedzieć, jak napisać kod do programu Excel, w którym mogę wykonać niestandardowe porównanie, które będzie podobne

rzekomy:

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)

Nie trzeba dodawać, że nie wiem, jak programować lub korzystać z VB. Przepraszam.

Kowal
źródło

Odpowiedzi:

1

Utwórz kolumnę pomocnika. W wierszu 2 tej kolumny (zakładając, że wiersz 1 ma nagłówki) wprowadź formułę

=MID(A2,9,4)

Spowoduje to wyodrębnienie „trzeciego parametru” z wartości w pierwszej kolumnie. Następnie posortuj według kolumny pomocnika:

sortowanie według kolumny pomocniczej

Scott
źródło
1

Podejście, które wybrałbym, to wygenerowanie dodatkowej kolumny danych. Zakładając, że format twoich wartości w kolumnie pierwszej ma zawsze stałą długość, tak jak w twoim przykładzie, użyłbym, =MID(A2,9,4)aby wyodrębnić trzeci element do oddzielnej komórki, abyś mógł następnie posortować według tej kolumny. Mój przykład formuły wybiera 4 znaki, zaczynając od pozycji 9 znaków, co wydaje się działać w przypadku pokazanych przykładów.

Jeśli potrzebujesz formuły, która wyodrębnia trzeci element na podstawie znalezienia drugiej i trzeciej kreski oraz liczby między nimi, którą można zrobić, po prostu muszę grać z tym jednym, aby znaleźć najkrótsze podejście, ale można to zrobić łatwo .

Tyson
źródło
0

Wiem, że masz odpowiedź, ale ponieważ zapytałeś, jak to zrobić za pomocą 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

Oznacza to również, że nie musisz mieć żadnych dodatkowych kolumn do sortowania, chociaż może to nie być dobra rzecz (odpowiedź Scotta pozwala ci korzystać z mocy Excela, podczas gdy moja odpowiedź VBa nie jest dzwonkiem i może nie być bardzo wydajny z bardzo dużymi danymi)

Dave
źródło