使用没有自定义列表的Excel自定义排序


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。抱歉。

Answers:


1

创建一个助手列。在该列的第2行(假设第1行有标题)中输入公式

=MID(A2,9,4)

这将从第一列中的值中提取“第三参数”。然后在帮助器列上排序:

在助手列上排序


1

我将采用的方法是生成额外的数据列。假设第一列中的值的格式始终为固定长度,如我的示例所示,将 =MID(A2,9,4)第三个元素提取到一个单独的单元格中,以便可以对该列进行排序。我的公式示例从第9个字符位置开始选择了4个字符,这似乎适用于所示数据示例。

如果您需要一个公式来找到第二个和第三个破折号并提取它们之间的数字来提取第三个元素,那么我也只需要实际使用那个破折号即可找到最短的方法,但是可以轻松完成。


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

这也意味着您不需要仅用于排序的任何额外列,尽管这实际上可能不是一件好事(Scott的答案的确允许您使用Excel的功能,而我的VBa答案却无济于事,可能不是非常有效的大数据)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.