返回列表 上一主題 發帖

[發問] Excel VBA條件排序問題

回復 1# 蒼雪
用VBA解如下:
Sub test()
    arr = Array("L20", "L10", "L30")
    Application.AddCustomList listArray:=arr
    n = Application.CustomListCount
    For r = 1 To 9
        Cells(r, 2).Value = Split(Cells(r, 1).Value, "[")(0)
        Cells(r, 3).Value = Split(Split(Cells(r, 1).Value, "/")(0), "[")(1)
        Cells(r, 4).Value = Split(Split(Cells(r, 1).Value, "/")(1), "]")(0)
    Next r
    [A1].CurrentRegion.Sort Key1:=[B1], OrderCustom:=n + 1, key2:=[C1], key3:=[D1]
    Application.DeleteCustomList n
    Columns("B:D").Delete
End Sub

另外底下順序是否反了?

L20[7.5/B.5]S
L20[7/C]N

應該是:
L20[7/C]N
L20[7.5/B.5]S

TOP

回復 15# 蒼雪
可能要先了解2個問題:
1.排序索引欄是在那一欄?例如:本程式是以A欄做為排序條件。
2.各欄第1列有沒有抬頭?

本巨集是透過輔助欄來排序的,所以要先釐清欄位位置及數量,如能上傳檔案更好。

TOP

回復 17# 蒼雪
請參考
  1. Sub test()
  2.     arr = Array("L20", "L10", "L30")
  3.     Application.ScreenUpdating = False
  4.     Application.AddCustomList listArray:=arr
  5.     n = Application.CustomListCount
  6.     er = [C65536].End(3).Row
  7.     For r = 2 To er
  8.         Cells(r, 5).Value = Split(Cells(r, 3).Value, "[")(0)
  9.         Cells(r, 6).Value = Split(Split(Cells(r, 3).Value, "/")(0), "[")(1)
  10.         Cells(r, 7).Value = Split(Split(Cells(r, 3).Value, "/")(1), "]")(0)
  11.     Next r
  12.     Range("A2:G" & er).Sort Key1:=[E2], OrderCustom:=n + 1, key2:=[F2], key3:=[G2]
  13.     Application.DeleteCustomList n
  14.     Columns("E:G").Delete
  15.     Application.ScreenUpdating = True
  16. End Sub
複製代碼

TOP

回復 19# 蒼雪
Q1.流程說明:
1.因你的第一順位排序(L20, L10, L30)非常規性,因此先將你的規則套入自訂排序清單中。
2.將C欄排序索引欄的資料,利用Split資料剖析方式拆解至E、F、G的輔助欄內。
3.利用E、F、G欄為索引,並依其順序分3次重新排序所有資料,請注意第1次是用自訂清單來排序。
4.排序完成後,移除剛置入的自訂排序清單,也刪除不需再使用的E、F、G欄。

Q2.拆開之後,又是怎麼將他們組合?
由上述所知,程式只有拆解並沒有再將它組合喔。

TOP

回復 21# 蒼雪
是啊∼排序完成後,就不需要再留存無用的資料囉。

另外以模擬資料的方式,加寫兩支不用自訂清單的排序程式,1支是只用1個輔助欄來排序,另外1支是不用
輔助欄來排序,有興趣的話請下載參考。
還有,以上均沒有加寫防呆程式碼喔,若有Bug請自行除錯。
Excel VBA條件排序.rar (20.04 KB)

TOP

回復 23# 蒼雪
請參考。
Sub test()
    arr = Array("L20", "L10", "L30")
    Application.ScreenUpdating = False
    er = [C65536].End(3).Row
    For r = 2 To er
        L = Application.Match(Split(Cells(r, 3).Value, "[")(0), arr, 0)
        N = Format(Split(Split(Cells(r, 3).Value, "/")(0), "[")(1), "00.0")
        E = Left(Split(Split(Cells(r, 3).Value, "/")(1), "]")(0), 1)
        If L = 1 And N >= 7 And N <= 16 And Asc(E) >= 65 And Asc(E) <= 70 Then
            Cells(r, 5).Value = L & N & E
        End If
    Next r
    Range("E2:E" & er).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Range("A2:E" & er).Sort Key1:=[E2]
    Columns("E").ClearContents
    Application.ScreenUpdating = True
End Sub

TOP

        靜思自在 : 要批評別人時,先想想自己是否完美無缺。
返回列表 上一主題