|
楼主 |
发表于 2021-9-17 14:04
|
显示全部楼层
是的,hashtable是不支持空键和空值的
不过就你帖子的那个问题,AB两列100多万条数据和D列60多万条数据,去重求两个的差集
https://club.excelhome.net/forum ... ;page=3#pid10782267
去空不是主要问题吧,速度才是主要问题,去空在VBA应该很好处理吧,分开取值,用个单元格的END属性,如果列数多加个循环。
在VBA中用哈希表,包括读写单元格8秒多,虽然比之前帖子里我的那个插件慢了点,但也可以接受了吧?
如果是字典你试试,看看要多久。。。
-------------------------------------------------------------------------------------------
Sub Test()
Dim T, arr, res, i, x
Dim Ht As IDictionary: Set Ht = CreateObject("System.Collections.HashTable")
Dim keys As IEnumerable: Set keys = Ht.keys
T = Timer
'获取单元格数据装入哈希表
GetHashTable Range("a2:a" & Range("A" & Cells.Rows.Count).End(3).Row).Value, Ht
GetHashTable Range("b2:b" & Range("B" & Cells.Rows.Count).End(3).Row).Value, Ht
arr = Range("d2:d" & Range("D" & Cells.Rows.Count).End(3).Row)
'去除包含再D列的数据
For Each x In arr
If Ht.Contains(x) Then Ht.Remove (x)
Next
'将数据写入单元格
ReDim res(1 To Ht.keys.Count, 1 To 1)
i = 0
For Each x In keys
i = i + 1: res(i, 1) = x
Next
Range("G1").Resize(Ht.keys.Count, 1) = res
MsgBox "耗时:" & Timer - T & vbNewLine & "去重求差集后数量:" & Ht.keys.Count
End Sub
Sub GetHashTable(arr, Ht) '将单元格的数据添加到哈希表
Dim i&
For i = 1 To UBound(arr)
Ht(arr(i, 1)) = vbNull
Next
End Sub
|
-
评分
-
1
查看全部评分
-
|