返回列表 上一主題 發帖

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

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

想請問各位大大
若在同一儲存格內,可以利用三種條件下去排序嗎?
例如︰
L20[9/C]N
L20[7.5/B.5]S
L20[3.5/B.5]E
L20[15.5/D]N
L20[19/F]N      
L20[15.5/F.5]N  
L20[7/C]N      
L20[2/E]S      
L20[21/E]N      
     
---------------------------------------------------------
第一個條件為 L20、L10、L30,中括弧前為一個條件(紅色)
排序完成後,再來以中括弧內的數字大小排序(藍色)
最後以中括弧內的英文作排列(綠色)

L20[15.5/D]N

希望會排序成下列情況

L20[2/E]S  
L20[3.5/B.5]E
L20[7.5/B.5]S
L20[7/C]N  
L20[9/C]N
L20[15.5/D]N
L20[15.5/F.5]N  
L20[19/F]N         
L20[21/E]N      

還請各位大大幫忙想了,謝謝。

回復 24# Kubi


    太強大了,讓我學到好多。
    像是 Application不用 WorksheetFunction 可以直接使用sum ...等語法。

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

回復 22# Kubi


抱歉,想再多問個問題。

若是條件排序完成後,我可以選擇哪些資料要留下嗎?

例︰ 排序後
L20[2/E]S  
L20[3.5/B.5]E
L20[7/C]N  
L20[7.5/B.5]S
L20[9/C]N
L20[15.5/D]N
L20[15.5/F.5]N  
L20[19/F]N         
L20[21/E]N

而我要的資料 第一個判別留下的為 L20,第二個為 7~16之間的數字,第三個為 A~F.5 之間的英文。
其餘的資料則Delete。

還懇請大大指教,謝謝。

TOP

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

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

TOP

回復 20# Kubi


所以是,以後面的排序完成後,再將資料刪除囉?

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

回復 18# Kubi


抱歉,我學得不是很多。
想請問你,這整個流程的說明可以嗎?

尤其是拆開之後,又是怎麼將他們組合?

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

回復 16# Kubi


抱歉,該檔案我沒辦法丟出來...公司內不可帶出

會有 A、B、C、D欄
主要排序索引欄位會在C欄
各欄第一位會有抬頭

TOP

        靜思自在 : 愛不是要求對方,而是要由自身的付出。
返回列表 上一主題