使用 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

这也意味着您不需要任何额外的列来进行排序,尽管这实际上可能不是一件好事(斯科特的答案确实允许您使用 Excel 的功能,而我的 VBa 答案没有任何作用,并且对于非常大的数据可能效率不高)

相关内容