如何對字典的鍵值進行排序處理

大家好,今日我們繼續講解VBA數組與字典解決方案,今日講解第59講內容:利用工作表函數,對字典的鍵值按大小排序,並給出對應的鍵.

在字典和數組中,是不能如工作表中那樣進行直接排序的,需要藉助於函數來進行.我在上一講中講了利用工作表函數large進行排序的方法,今日我們講解利用MAX排序,已經利用match定位的方法.關於這些函數,在本書中不做重點的講解,只是利用,如果不清楚,可以參考我的其他書籍資料,或者到網上搜索相關的資料參考。

實例,如下面截圖數據,在A列中有若干數據,我們要對齊排重處理,同時要統計出每個數據的出現次數,最後按出現的次數進行多少排序:

如何對字典的鍵值進行排序處理

思路,和上一講大體一致,我們要把這些數據首先裝到字典中,在裝的同時要計算每個數字出現的次數,然後對出現的次數建立循環,每次取出最大值,並根據最大值的位置求出對應的鍵,當每次取出最大值後要把這個最大值變成空,以便下次取還是最大值。下面看我給出的代碼:

Sub mynzsz_59() '第59講 利用工作表函數,對字典的鍵值按大小排序,並給出對應的鍵

Dim ran

Sheets("59").Select

Set mydic = CreateObject("Scripting.Dictionary") '字典

TT = Cells(Rows.Count, 1).End(xlUp).Row

For Each ran In Sheets("59").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 '需要注意此處要加VALUE

Else

mydic(ran.Value) = mydic(ran.Value) + 1

End If

End If

Next

'注意此處把字典的鍵和鍵值取出

k = mydic.keys: T = mydic.items

'建立數組,用於存放目標數據

ReDim X(1 To mydic.Count, 1 To 2)

For i = 1 To mydic.Count

X(i, 2) = Application.Max(T)

'找到鍵的位置

W = Application.Match(X(i, 2), T, 0) - 1

'提取鍵

X(i, 1) = k(W)

'相應的鍵值變成空,以用MAX函數

T(W) = ""

Next

[e:f].Clear

[E1] = "排序": [f1] = "重複次數"

Sheets("59").[E2].Resize(mydic.Count, 2) = X

End Sub

代碼截圖:

如何對字典的鍵值進行排序處理

代碼解析:

1 上述代碼實現了: 這些數據首先裝到字典mydic中,在裝的同時要計算每個數字出現的次數,放到鍵值中,然後提取出見和鍵值放到數組中k = mydic.keys: T = mydic.items

在鍵值中建立循環,利用MAX函數每次取出最大值,並根據最大值的位置W = Application.Match(X(i, 2), T, 0) - 1求出對應的鍵,當每次取出最大值後要把這個最大值變成空,以便下次取的還是最大值有效.最後回填數據。

2 Set mydic = CreateObject("Scripting.Dictionary") '字典

上述語句創建字典

3 For Each ran In Sheets("59").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 '需要注意此處要加VALUE

Else

mydic(ran.Value) = mydic(ran.Value) + 1

End If

End If

Next

上述語句將數值放到字典中,需要注意的是一定要用ran.Value,此處讀者可以自己測試一下,如果不加value有什麼不同,通過測試理解一下字典見和鍵值的意義。

4 '注意此處把字典的鍵和鍵值取出

k = mydic.keys: T = mydic.items

上述語句提取出鍵和鍵值到數組中

5 For i = 1 To mydic.Count

X(i, 2) = Application.Max(T)

'找到鍵的位置

W = Application.Match(X(i, 2), T, 0) - 1

'提取鍵

X(i, 1) = k(W)

'相應的鍵值變成空,以用MAX函數

T(W) = ""

Next

在上述語句中利用建立了一個循環,在每次循環中取max值,取出後將數值變成空。同時用W = Application.Match(X(i, 2), T, 0) – 1 函數找到鍵的位置.

6 [e:f].Clear

[E1] = "排序": [f1] = "重複次數"

Sheets("59").[E2].Resize(mydic.Count, 2) = X

End Sub

上述語句回填數據.

下面看運行的截圖:

如何對字典的鍵值進行排序處理

今日內容迴向:

1 如何利用MAX 和MATCH進行排序?

2 上述在給字典賦值時不用VALUE是否可以?


分享到:


相關文章: