第300期常用「積木」過程案例分享,今日內容是亂序排序的實現。提供給大家的這些內容是我多年經驗的記錄,來源於我多年的實踐。大家在學習VBA的時候,可以把這些代碼塊作為一塊塊的積木對待,平時積累,用時拿來修正、組合。這就是我的「積木編程」的思想,就是我推出的「積木」方案,希望大家加以利用。最近代碼多是出自第三套教程」VBA數組與字典解決方案」。
Sub mynzsz_66()
Sheets("66").Select
Set mydic = CreateObject("Scripting.Dictionary")
For Each ran In Sheets("66").Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
If ran.Value <> "" Then
If Not mydic.exists(ran.Value) Then
mydic.Add ran.Value, 1
Else
mydic(ran.Value) = mydic(ran.Value) + 1
End If
End If
Next
[g:e].ClearContents
Sheets("66").Range("e1") = "數據": Sheets("66").Range("f1") = "次數"
Sheets("66").[E2].Resize(mydic.Count) = WorksheetFunction.Transpose(mydic.keys)
For I = 1 To mydic.Count
Cells(I + 1, "f") = mydic(Cells(I + 1, "e").Value)
Next
Set mydic = Nothing
Set mydic = CreateObject("Scripting.Dictionary") '字典
rs = Range("C1").End(xlDown).Row
For I = 2 To rs
mydic(Cells(I, "C").Value) = I - 1
Next
rs = Range("E1").End(xlDown).Row
For I = 2 To rs
Cells(I, "g") = mydic(Cells(I, "E").Value)
Next
Set Rng = Range(Cells(1, "e"), Cells(rs, "g"))
Rng.Sort key1:=Range(Cells(1, "g"), Cells(rs, "g")), Order1:=xlAscending, Header:=xlYes
Columns("g").Clear
Set mydic = Nothing
End Sub
代碼講解:
1 上述代碼實現了按自定義排序要求進行排序。首先將數據裝入字典mydic,同時計算重複次數裝入鍵值,回填數據,並清空字典。然後,將字典再次裝載,這次是裝自定義排序的數據,鍵值用排序要求的順序,這裡用行數代替;最後,在回填數據區域G列按照E列的值獲取應該排序的順序值,設定排序區域,按照G列進行排序,排序後刪除G列數據。
2 '數據賦值給字典,同時統計出現的次數
For Each ran In Sheets("66").Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
If ran.Value <> "" Then
If Not mydic.exists(ran.Value) Then
mydic.Add ran.Value, 1
Else
mydic(ran.Value) = mydic(ran.Value) + 1
End If
End If
Next
3 '自定義排序序列,排序的基準
Set mydic = Nothing
Set mydic = CreateObject("Scripting.Dictionary") '字典
rs = Range("C1").End(xlDown).Row
For I = 2 To rs
mydic(Cells(I, "C").Value) = I - 1
Next
上述語句將自定義排序的序列裝入字典,同時鍵值取I-1即要排序的值
4 '添加自定義排序序列。
rs = Range("E1").End(xlDown).Row
For I = 2 To rs
Cells(I, "g") = mydic(Cells(I, "E").Value)
Next
在回填區域的G列,根據E列的值填上應排的序號。
5 '實現自定義排序
Set Rng = Range(Cells(1, "e"), Cells(rs, "g"))
Rng.Sort key1:=Range(Cells(1, "g"), Cells(rs, "g")), Order1:=xlAscending, Header:=xlYes
上述代碼在E:G列排序,排序的規則是按G列,然後刪除G列的值。
在取代OFFICE新的辦公軟體沒有到來之前,誰能在數據處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!學習VBA是個過程,如太白詩云:眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山。
「水善利萬物而不爭」,綿綿密密,微則無聲,巨則洶湧。學習亦如此,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時再去做自欺欺人的言論。要努力提高自己,有一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。茶,滿也好,少也好,不要計較;濃也好,淡也好,其中自有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。在後疫情更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。學習時微而無聲,利用時則巨則洶湧。
VBA是利用Office實現自己小型辦公自動化的有效手段,我記得20年前自己初學VBA時,那時的資料甚少,只能看源碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重複我之前的經歷,我根據自己多年VBA實際利用經驗,推出了五部VBA專門教程。
第一套:VBA代碼解決方案是VBA中各個知識點的講解,覆蓋絕大多數的VBA知識點,初學必備;
第二套:VBA資料庫解決方案資料庫是數據處理的專業利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法和實例操作。
第三套:VBA數組與字典解決方案數組和字典是VBA的精華,字典是VBA代碼水平提高的有效手段,值得深入的學習。
第四套:VBA代碼解決方案之視頻是專門面向初學者的視頻講解,可以快速入門,更快的掌握這門技能。
第五套:VBA中類的解讀和利用這是一部高級教程,講解類的虛無與肉身的度化,可以對促進自己理論的提高。
學習的過程也是修心的過程,修一個平靜的心。在代碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。利人就是利己。這些教程也是為幫助大家起航,助上我自己之力,我的上述教程是我多的經驗的傳遞,大家可以根據1,3,2,5或者是4,3,2,5的順序逐漸深入的逐漸學習。
最後將一闕詞送給致力於VBA學習的朋友:
浮雲掠過,暗語無聲,
唯有清風,驚了夢中啼鶯。
望星,疏移北鬥,
奈將往事雁同行。
阡陌人,昏燈明暗,
忍顧長亭。
多少VBA人,
暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
分享成果,隨喜正能量