Ich möchte Excel-Zeilen sortieren können, in denen die Daten wie folgt aussehen:
Column - 1 Other Columns
701-GBL-1843-MLMK blah
566-JJB-2785-MYJW
254-WYD-3220-NAND
884-GLE-2843-FRYA
Und ich möchte die Daten nach dem dritten Parameter sortieren können, sodass ich nach den Zahlen in der Mitte der Zeichenfolge vergleiche, sodass das Ergebnis wie folgt aussieht:
701-GBL-1843-MLMK
566-JJB-2785-MYJW
884-GLE-2843-FRYA
254-WYD-3220-NAND
Gibt es eine Möglichkeit, dies zu tun, anstatt eine benutzerdefinierte Liste zu erstellen, die 100000000000000 Einträge lang sein wird?
Im Grunde möchte ich wissen, wie man Code für Excel schreibt, wo ich einen benutzerdefinierten Vergleich machen kann, der wie folgt aussieht
Pseudo:
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)
Es ist unnötig zu sagen, dass ich weder programmieren noch VB verwenden kann. Tut mir leid.
Antwort1
Erstellen Sie eine Hilfsspalte. Geben Sie in Zeile 2 dieser Spalte (vorausgesetzt, Zeile 1 hat Überschriften) die Formel ein
=MID(A2,9,4)
Dadurch wird der „dritte Parameter“ aus dem Wert in der ersten Spalte extrahiert. Anschließend wird nach der Hilfsspalte sortiert:
Antwort2
Mein Ansatz wäre, eine zusätzliche Datenspalte zu generieren. Vorausgesetzt, das Format Ihrer Werte in Spalte eins hat immer eine feste Länge wie in Ihrem Beispiel, würde ich verwenden,
=MID(A2,9,4)
um das dritte Element in eine separate Zelle zu extrahieren, damit Sie dann nach dieser Spalte sortieren können. Mein Formelbeispiel wählt das 4. Zeichen ab der 9. Zeichenposition aus, was für die gezeigten Datenbeispiele zu funktionieren scheint.
Wenn Sie eine Formel brauchen, die das dritte Element extrahiert, indem der zweite und dritte Bindestrich und die Zahl dazwischen ermittelt werden, ist das auch möglich. Ich muss nur ein bisschen damit herumspielen, um den kürzesten Ansatz zu finden, aber es ist problemlos möglich.
Antwort3
Ich weiß, dass Sie eine Antwort haben, aber da Sie gefragt haben, wie es mit VBa geht
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
Dies bedeutet auch, dass Sie keine zusätzlichen Spalten nur zum Sortieren benötigen, obwohl dies eigentlich keine gute Sache sein muss (Scotts Antwort ermöglicht es Ihnen, die Leistung von Excel zu nutzen, während meine VBa-Antwort ohne Schnickschnack auskommt und bei sehr großen Datenmengen möglicherweise nicht sehr effizient ist).