![使用 Excel(不带自定义列表)进行自定义排序](https://linux22.com/image/1416927/%E4%BD%BF%E7%94%A8%20Excel%EF%BC%88%E4%B8%8D%E5%B8%A6%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%97%E8%A1%A8%EF%BC%89%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%92%E5%BA%8F.png)
我希望能够对 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 答案没有任何作用,并且对于非常大的数据可能效率不高)