你需要自定義排序嗎?VBA代碼可以實現

2020-12-25 VBA語言專家

第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人,

暗夜中,悄聲尋夢,盼卻天明。

怎無憑!

分享成果,隨喜正能量

相關焦點

  • excel中2000行數據以行排序,你需要多長時間
    Hello,大家好,今天跟大家分享下我們如何使用錄製宏批量的按照行來對數據排序,這個之前發過視頻,但是很多粉絲表示沒看懂,今天就來詳細的介紹下這種方法一、宏是什麼宏本質上就是我們所說的vba代碼,錄製宏就是將我們的操作記錄下來,將其編譯為vba代碼,當我下次需要重複操作的時候只需要運行宏
  • Excel中如何實現按照自定義序列排序
    Excel中常見的排序方式有按照數據升序、降序和顏色排序,但工作中有時候需要按照英文日期、學歷、部門、職稱、天幹地支、領導關心的數據優先級等許多自己定義的序列排序。如何實現按照自己的心願隨意排序呢?本文以下表為例,詳細介紹如何按照學歷來排序,按照其他序列排序的方法也類似。
  • Excel vba 利用定義名稱實現用戶登錄功能
    文/江覓易見在vba 中實現用戶登錄,並對登錄用戶進行身份識別,然後對用戶進行分組管理,此類功能值得進一步思考。這裡介紹一種方法,利用Excel中的名稱管理來進行身份識別,起到用戶登錄次數以及增減用戶的功能。
  • excel VBA是什麼?VBA編程入門教程
    VBA是一種面向對象的解釋性語言,通常使用來實現Excel中沒有提供的功能、編寫自定義函數、實現自動化功能等。excel vbaVBA對於沒有學過計算機語言的人來說會很陌生,會被它陌生的語句所嚇倒,從而放棄對它的學習。但是小編可以告訴大家,VBA其實很簡單。學會之後,你會愛上它,因為它真的很有趣。
  • Java實現冒泡排序算法
    如果你還沒有看上一篇的內容,可以去看一看,應該會有所收穫。從這一篇開始,我們把每一種排序算法,從算法的思想,到代碼實現都做一個分享。那麼你準備好了嗎?我們這一篇的主角是:冒泡排序#考考你:1.你知道冒泡排序的核心思想嗎?2.你能用java實現冒泡排序嗎?3.你能寫出更優秀的冒泡排序代碼嗎?
  • VBA字典與工作表函數結合實現排序
    [E2].Resize(mydic.Count, 2) = XSet mydic = NothingEnd Sub代碼解析:1 上述過程實現了:我們首先把數據裝入字典mydic,將數值放入字典的鍵,出現的次數放入鍵值中數,然後把鍵及鍵值分別放入數組
  • 不會vba編程,學會這些方法,少走許多彎路,函數式編程
    那為什麼還要學習vba編程呢?No.2在可用到一些函數中,或許在某些情況下還需要我們自定義一下功能。那麼在靈活性方面,就更加需要自己動手。vba 可以實現你想實現的工作方式,比如它引入了對象,窗體對象、控制項對象、name對象、style對象,windows對象等等。實際上這是一種面向對象的編程,簡單來說就是了解各熟悉各種各樣的對象,然後這些對象有各自的屬性,可以自由地對這些屬性進行設置,再用邏輯語句將這些對象進行方法調用。
  • Excel如何設置自定義排序和填充序列?數據輸入和排序必備技能
    Microsoft Excel中的填充序列功能只是針對部分類型的數據,例如:季度、月份、星期、天幹、地支、序號等,而且對這些數據的格式也有一定的要求,否則無法實現序列填充。如果需要經常使用某些序列數據,怎麼才能實現這些數據快速填充呢?不需要VBA和函數,動動手指設置Excel選項就能輕鬆解決問題。
  • Excel自定義序列方法進行排序技巧
    Excel在對表格數據進行排序時,如果列的內容是文本時,默認是按照文本的拼音順序進行先後排列。那麼在實際工作中碰見職務等沒有辦法使用拼音順序時,則需要使用自定義序列的方法。第一步:把滑鼠光標定位在表格裡,然後單擊【數據】—【排序】然後會彈出「排序」對話框。第二步:在排序對話框下的「主要關鍵字」選擇示例表格「職務」標題,在次序下選擇「自定義序列」如下圖。
  • 利用VBA代碼如何打開任意程序
    今日分享的是NO.242-243,內容是:NO. 242:VBA代碼使用Shell函數打開記事本程序VBA過程代碼243:VBA數組的定義及創建VBA過程代碼242:VBA代碼使用Shell函數打開記事本程序Sub Mynz()
  • 如何替換單元格內容,vba代碼幫你一步解決
    按鈕代碼:Private Sub ChangeName()Dim s As WorksheetSet s = ThisWorkbook.ActiveSheetDim r As Range, ro As Long, Rchr As String, xStr As StringxStr = vba.Trim(Me.TextBox1.Value)'文本框內容Set r = s.Range
  • Excel VBA 不可一世的宏中,基本數據構成你知道多少
    在上一期我們說到VBA的基本組織結構,那麼我們今天就來說說組成這些VBA代碼的磚瓦是由哪幾部分構成的,也就是說vba的處理數據的磚瓦。常量這值在我們的以後編寫中,也需要用到,比如我們需要引用某一天的匯率或者稅率,這個時候我們可以這些寫代碼,如下圖:以上就是我們定義了三個常量,就是把數字賦值給到某一個字符串,這樣做的好處就是,我們在用的時候,可以多次引用這個字符串即可,當我們需要修改的時候,只需要修改一次即可,是不是感覺很方面?但是請千萬記住,不要少了const,這是在VBA中規定好的寫法。
  • Excel vba 動態添加按鈕控制項 CommandButton
    文/江覓易見動態添加按鈕有時在vba編程中運用很多,也是一個比較容易實現的過程。這裡寫了一個很小的例子,做個示範,動態添加按鈕,而且按鈕數量不限,可批量添加,位置、大小、按鈕Caption自定義。如果對代碼不很熟悉,套用也較方便。下面是動態效果圖,文章結尾有代碼,可以參考使用。
  • 利用VBA代碼,對Excel表格進行字體設置
    No.1字體設置是Excel或Word辦公軟體最簡單的操作,下面把所有字體對象的屬性羅列一遍,介紹一下,如何使用vba代碼進行相應的字體設置。下圖為字體對象Font的所有屬性。一共18個。其中進了相對簡單,不需要之麼高深的理解。No.2下圖以一個例子,對所有Font對象的設置進行一個可視化操作,可以在左邊值的列中選擇相應的值,單擊按鈕即可看到字體效果。十分簡單。下面重點看一下代碼,如何來實現。
  • Excel表數據改變,每天的排名變化,錄製宏自動排序
    我們在工作中,經常會統計員工的完成數據,來督促員工達成每月的任務目標,如下所示是公司統計的員工任務完成情況:其中E列是用RANK函數根據完成率自動進行的排名,在E2使用的公式是:=RANK(D2,D:D)為了讓名次呈現的更直觀,我們通常會對數據進行排序操作
  • vba編程,如何畫帶箭頭直線,教你這麼做馬上學會畫流程圖
    下面具體介紹一下,如何利用vba代碼進行設置線條的一些方法。vba代碼畫線用到一個對象:LineFormat下圖為LineFormat屬性:屬性看上去較多,但大多有一定的規則,使用起來還是比較容易理解的。
  • Excel vba 無邊框窗體,如何實現
    文/江覓易見Excel vba製作無邊框是一個特殊的需求,有些時候,在一些功能上需要運用到沒有標題欄的窗體,沒有最大化、最小化和關閉功能按鈕。這就需要做一個無邊框的窗體。但是又苦於經驗技術有限,實現起來相對困難,怎麼辦?下面介紹一下無邊框製作Form窗體的方法。
  • 基礎不牢地動山搖記住 Java 面試中常用的八種排序算法與代碼實現
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫1.直接插入排序經常碰到這樣一類排序問題:把新的數據插入到已經排好的數據列中。
  • 兩個Excel表格,內容部分重合,排序不同,如何實現排序相同
    我們常常需要核對兩個表格,如果兩個表格的順序相同,核對工作就會簡單很多,可實際往往不是。就像下圖中的兩個表格,大部分貨品相同,少部分貨品有差異,怎樣將這兩個表格按照某個關鍵字(貨品)調整成一樣的順序呢?相信會有不少朋友使用VLOOKUP之類的函數來處理,這當然是可以的。
  • JavaScript面經之冒泡排序
    文/大白老師圖/大白老師我們去大廠面試前端的時候,最容易被問及的一個內容就是排序,而其中,冒泡排序作為最基礎的排序算法,很多時候是被要求進行手寫代碼的,面試官通過對手寫代碼的考察,可以看出求職者的算法基礎功底