使用 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)將第三個元素提取到單獨的單元格中,以便您可以對該列進行排序。我的公式範例挑選出從第 9 個字符位置開始的 4 個字符,這似乎適用於所示資料的範例。

如果您需要一個基於查找第二個和第三個破折號以及它們之間的數字來提取第三個元素的公式,它也可以完成,我只需要實際使用該公式來找到最短的方法,但它可以輕鬆完成。

答案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

這也意味著您不需要任何額外的列來進行排序,儘管這實際上可能不是一件好事(Scott 的答案確實允許您使用 Excel 的功能,而我的 VBa 答案沒有任何響鈴,可能也不是)對於非常大的數據非常有效)

相關內容