VBA數組與字典解決方案第44講:利用字典排重,並提取不重複值
摘要:如果是不要區分大小寫,那麼比較的模式要利用vbTextCompare,在代碼中首先要先把數據裝入數組,然後在數組中建立一個循環,利用字典,判斷是否重複,不重複的放到另外一個數組中,下面看我給出的代碼:。今日就專門講解一下數組中利用字典的特性來排重處理,然後把數據裝入另外的數組,並回填。
大家好,我們今天繼續講解VBA數組與字典解決方案,今日的內容是第44講,利用字典來判斷數組的值是否重複,並提取出不重複的值。對於字典的應用,排重是很普遍的應用之一。對於數組的排重,如果單用數組的內容,在我之前數組的講解中,是相當費勁的,如果利用字典,排重幾乎是不費力的就可以完成。今日就專門講解一下數組中利用字典的特性來排重處理,然後把數據裝入另外的數組,並回填。
實例的數據如下:在工作表中有下面的數據,要先放到數組中,然後進行排重處理,排重的時候要注意不要區分大小寫,排重後的數據要先放到另外一個數組中,然後回填到工作表。
如何能夠實現這個目的呢?如果是不要區分大小寫,那麼比較的模式要利用vbTextCompare,在代碼中首先要先把數據裝入數組,然後在數組中建立一個循環,利用字典,判斷是否重複,不重複的放到另外一個數組中,下面看我給出的代碼:
Sub mynzsz_44() '第44講 利用字典來判斷數組的值是否重複,並提取出不重複的值
Dim brr() '聲明一個數組brr放結果
Sheets("44").Select
Set mydic = CreateObject("scripting.dictionary")
'不區分字母大小寫比較
mydic.CompareMode = vbTextCompare
'數據源裝入數組myarr
myarr = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).row)
ReDim brr(1 To UBound(myarr), 1 To 1)
'標題行不要,開始遍歷數組
For i = 2 To UBound(myarr)
'將數據轉換成字符串類型,因爲字典關鍵字認爲數值和文本型數值是不相等的
s = myarr(i, 1)
If Not mydic.exists(s) Then
'如果字典中不存在s,則作爲關鍵字裝入字典,個數累加,結果裝入結果數組
mydic(s) = ""
k = k + 1
brr(k, 1) = myarr(i, 1)
End If
Next
[E:E].ClearContents
[E1] = "排重結果"
With [E2].Resize(k, 1)
'設置文本格式,防止某些文本數值變形
.NumberFormat = "@"
.Value = brr
End With
MsgBox "一共有:" & k & "個不重複值。"
'釋放字典內存
Set mydic = Nothing
End Sub
代碼截圖:
代碼講解:
1 上述代碼實現了對一個數組的排重處理,過程和要求的完全一致,大家要注意,實現一個目的有很多的方法,有的會簡單些,有的會複雜些,我會盡可能的多利用些方法來實現目的,讓大家在學習的過程中能有所比較,無論是哪一種方法,讀者要充分的理解,如果實在理解不了可以記住代碼爲自己所用也可。
2 Set mydic = CreateObject("scripting.dictionary")
'不區分字母大小寫比較
mydic.CompareMode = vbTextCompare
此處我給出了在字典中鍵的比較方式,是不區分大小的。
3 myarr = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).row)
ReDim brr(1 To UBound(myarr), 1 To 1)
當確定了數組myarr 後,我們就可以確定brr()的大小了。這裏我命名的這個動態數組是二維數組
4 '將數據轉換成字符串類型,因爲字典關鍵字認爲數值和文本型數值是不相等的
s = myarr(i, 1)
在這裏我給出了一個臨時的變量S,大家要理解我給出的解釋
5 If Not mydic.exists(s) Then
'如果字典中不存在s,則作爲關鍵字裝入字典,個數累加,結果裝入結果數組
mydic(s) = ""
k = k + 1
brr(k, 1) = myarr(i, 1)
End If
上述代碼中實現了對是否重複的判斷,並將不重複的值寫入數組。注意我這裏對於鍵值給出的是"",即空值
6 With [E2].Resize(k, 1)
'設置文本格式,防止某些文本數值變形
.NumberFormat = "@"
.Value = brr
End With
上述代碼實現了不重複數據的回填,不再多說了。
下面看代碼的運行:
今日內容迴向:
1 如何實現數組的排重處理?
2 數據回填要是文本格式要如何處理?