思路决定运行速度
excel提取重复值的数量(筛选出唯一值的数量)有很多方法,不同方法的运行速度差别很大,尤其在处理海量数据是选择不当的话速度能让人崩溃。
要提取重复值的数量分删除重复值+重复值计数2个动作,在低版本的excel一般采用函数Countif、函数match等求的处理,对于海量数据简直是煎熬,用高级筛选或删除重复值速度能稍微少一些,至于用VBA的字典或集合等方式更是蛮不可以,80万行数据要4000s才能给出结果。有没有更迅捷的方式?
下面是新写自定义函数适合所有excel版本,速度超快,100万行数据4s出数据,堪比高版本新出的函数unique。
思路:备份数据、原位排序、数组计数、恢复数据、输出
Function dys(a As Range) As Long'独有数
'a为在同一列內单元格区域,默认没有合并单元格,空行忽略不计数
i = Range(a.Cells(1, 1), a.Cells(a.Rows.Count, 1)) '把原始数据保存,最后再恢复
a.Cells(1, 1).Select
Range(a.Cells(1, 1), a.Cells(a.Rows.Count, 1)).Sort Key1:=a.Cells(1, 1), Order1:=1 '把原始数据排序便于比较
h = Range(a.Cells(1, 1), a.Cells(Cells(1048576, Selection.Column).End(xlUp).Row - a.Cells(1, 1).Row + 1, 1)) '把排序数据存入新数组提高比较运行速度
a.Cells(1, 1).Resize(UBound(i), 1) = i: Set i = Nothing'恢复数据、释放内存
For i = 2 To UBound(h)
If h(i, 1) = h(i - 1, 1) Then c = c + 1’对重复值计数,不能采用h(i, 1)<>h(i - 1, 1)N
ext
i = UBound(h) - c
Set h = Nothing'释放内存
dys = i
End Function
excel提取重复值的数量(筛选出唯一值的数量)有很多方法,不同方法的运行速度差别很大,尤其在处理海量数据是选择不当的话速度能让人崩溃。
要提取重复值的数量分删除重复值+重复值计数2个动作,在低版本的excel一般采用函数Countif、函数match等求的处理,对于海量数据简直是煎熬,用高级筛选或删除重复值速度能稍微少一些,至于用VBA的字典或集合等方式更是蛮不可以,80万行数据要4000s才能给出结果。有没有更迅捷的方式?
下面是新写自定义函数适合所有excel版本,速度超快,100万行数据4s出数据,堪比高版本新出的函数unique。
思路:备份数据、原位排序、数组计数、恢复数据、输出
Function dys(a As Range) As Long'独有数
'a为在同一列內单元格区域,默认没有合并单元格,空行忽略不计数
i = Range(a.Cells(1, 1), a.Cells(a.Rows.Count, 1)) '把原始数据保存,最后再恢复
a.Cells(1, 1).Select
Range(a.Cells(1, 1), a.Cells(a.Rows.Count, 1)).Sort Key1:=a.Cells(1, 1), Order1:=1 '把原始数据排序便于比较
h = Range(a.Cells(1, 1), a.Cells(Cells(1048576, Selection.Column).End(xlUp).Row - a.Cells(1, 1).Row + 1, 1)) '把排序数据存入新数组提高比较运行速度
a.Cells(1, 1).Resize(UBound(i), 1) = i: Set i = Nothing'恢复数据、释放内存
For i = 2 To UBound(h)
If h(i, 1) = h(i - 1, 1) Then c = c + 1’对重复值计数,不能采用h(i, 1)<>h(i - 1, 1)N
ext
i = UBound(h) - c
Set h = Nothing'释放内存
dys = i
End Function