【ExcelVBA】使⽤字典快速提取不重复记录
数据去重复⼀直是数据整理过程中常见的问题之⼀,Excel解决⽅法有【删除重复项】、【⾼级
筛选】、【数据透视表】、SQL语句、VBA的字典和集合等等……各有所长也各有所短。
可能还有⼩伙伴说还有函数……那啥……坦⽩说,“去重”⼀直都是函数最⼤的硬伤之⼀,虽然数
组公式可以实现,但那些数组公式的适应性、可操作性和运算效率都是渣渣的⼀匹。说来也是
奇怪……绝⼤部分语⾔都有专门的去重函数,⽐如distinct,但偏偏Excel函数没有……从03到16
⼗⼏年过去……⼀直没有…………。
说正事⼉……今天和⼤家分享的⽅法是VBA的字典法……。
举个栗⼦。
如下图所⽰,A列是⼀些数据,可能存在重复值,需要在C列得出不重复值,并告知不重复值的
个数。
代码如下:
Sub Mydistinct()
'vba编程学习与实践~看见星光
Dim d As Object, arr, brr, i&, k&, s$
Set d = CreateObject('scripting.dictionary')
'后期引⽤字典
'd.CompareMode = vbTextCompare
'不区分字母⼤⼩写
arr = Range('a1:a' & Cells(Rows.Count, 1).End(xlUp).Row)
'数据源装⼊数组arr
ReDim brr(1 To UBound(arr), 1 To 1)
'声明⼀个数组brr放结果。
For i = 2 To UBound(arr)
'标题⾏不要,从第2⾏开始遍历
s = arr(i, 1)
'强制将数据转换成字符串类型,原因见⼩贴⼠
If ists(s) Then
d(s) = ''
'如果字典中不存在s,则作为关键字装⼊字典
k = k + 1
'累加个数
brr(k, 1) = arr(i, 1)
'装⼊结果数组
End If
Next
[c:c].ClearContents
[c1] = '结果'
With [c2].Resize(k, 1)
resize函数vba.NumberFormat = '@'
'设置⽂本格式,防⽌某些⽂本数值变形
.Value = brr
End With
MsgBox '⼀共为你提取了:' & k & '个不重复值。'
Set d = Nothing
'释放字典
End Sub
运算结果:
⼩贴⼠:
1,该段代码区分字母⼤⼩写,即A和a并不重复,如果需要不区分字母⼤⼩写,解除代码中下⾯语句的注释块。
d.CompareMode = vbTextCompare
2,代码中有⼀句s = arr(i, 1),意思是将数据类型转换为字符串变量s。之所以这么操作,是因为字典关
键字认为数值和⽂本型数值是不相等的,举个例⼦,如下图,数值123和⽂本123,字典认为并不重复。
另外,即便数据区域的数值不存在⽂本型数值,也建议将之强制转换为字符串类型。
举个例⼦,在下⾯的链接中有⼀个⽰例⽂件,该⽂件的A列存在⼤量重复数值,但不论【删除重复项】还是【⾼级筛选】,均不能准确数据去重,如果不将数值类型转换为字符串,字典同样也不能准确去重,不信,你就测试看看呗~
握⽖,致安,下期见~
图⽂作者:看见星光
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论