我希望能夠對資料看起來像的 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 答案沒有任何響鈴,可能也不是)對於非常大的數據非常有效)