今天我们的场景是数据的去重并计数
说到这样的场景,很多的小伙伴一定会首先想到使用字典,没错,在这样的场景下,如果通过代码的方式来实现的话,那么首选一定是字典了。
但是这里又有很多的小伙伴会提出疑问,去重并计数,不是 可以直接用透视表嘛?为什么还要那么麻烦的去写VBA?
我们来看看今天的场景
留意到今天的数据源中,有两个数据源是非常的相似的,一个是大写的A1,一个是小写的a1,某些场合中,这两种不同的数据是代表着不同的意义的,那么在去重计数的时候,要分来来统计,但是透视表呢?就不行
我们可以看到传统的数据透视表呢,并不能够区分大小写,会将这两个混为一谈,统计出来的效果是错误的
所以在这样的情况下,我们还是要利用VBA的了。
那么VBA的那种方法呢?
起始字点并不是唯一选择,可以是字典,可以是集合,也可以是SQL
我们这里就来学习下字典的方法,因为数据只有一列,所以可以说是非常基础的字典的写法
对于字典还不太熟悉的小伙伴,可以好好的琢磨下这篇文章
直接来看代码
Subddd()
Dimsgm(),zxl()
Setzd=CreateObject("scripting.dictionary")
zd.CompareMode= 0
Fori= 2 To 79k =Cells(i, 1)Ifzd.exists(k) Thenzd.Item(k) =zd.Item(k) + 1Elsezd.Addk,Int(1)End If
Nexti
zl=zd.Count
sgm() =zd.keys()
zxl() =zd.Items()
Cells(1, 2).Resize(UBound(sgm()), 1) =WorksheetFunction.Transpose(sgm())
Cells(1, 3).Resize(UBound(sgm()), 1) =WorksheetFunction.Transpose(zxl())
End Sub
非常的简单,也是字典的最基本的写法
我们来看看最终的效果是如何的
很快就得到了我们想要的结果,效果非常的不错
成功的将小写和大写区分出来了,并且也是统计了相应的格式
一起来看看这个字典的写法吧
字典在使用之前,需要先申明一个变量,用这个变量来装字典。
Setzd=CreateObject("scripting.dictionary")
简单的一句话,那么当前系统中就有了zd这么一个字典了。
我们这里还有一个关键点,我们的字典要区分大小写,如果不能区分大小写,那么某种程度上就和透视表没什么区别了。
那么字典如何区分大小写呢?
zd.CompareMode= 0
他代表的就是字典是否区分大小写,有两种写法,一种是true/false,另外一种就是1/0
0和false代表的都是区分大小写
那么既然区分大小写,A1和a1,就不会被混为一谈了。
好,有了上面的这些铺垫之后,我们现在进入字典的核心,即字典的关键部分
我们都知道字典最大的功效,就是能够判断数据的唯一值,
如果将第二个相同的数据写入,那么就会报错,而今天的场景中,我们并不是要他报错,而是要实现相同值的累加
那么这里就衍生出来两个分支,字典已经存在一个唯一值,字典不存在唯一值
依次循环下来之后,我们就可以得到了一个字典,都是唯一值的字典
每一个字典对应的值也是存在的,当然字典的值 是没有办法通过本地窗体展现的
然后有了字典之后,我们就可以将字典写入了。
说到字典的写入,这里要又不得不再说下字典的组成
字典有两部分组成
那么我们写入的时候,也是需要将这个键值对分别写入,不能整体写入
既然是分别写入,那么肯定要先得到键和值
如何得到呢?
这里可以和数组搭配使用
sgm() =zd.keys()
zxl() =zd.Items()
两句代码,就成功的将字典的键和值,转到对应的两个数组中了,那么现在的字典的写入,就变成了数组的写入了。
数组的写入,就非常的简单了,给一个单元格区域,让他等于数组,就可以实现了。
来看看如何实现。
Cells(1, 2).Resize(UBound(sgm()), 1) =WorksheetFunction.Transpose(sgm())
Cells(1, 3).Resize(UBound(sgm()), 1) =WorksheetFunction.Transpose(zxl())
也是简单的两句话
这里有一个重点,那就是一定要增加WorksheetFunction.Transpose
这个是什么意思呢?
他是想的及时数组的转置,就相当于将一行数组,转变成一列数组,因为我们要一列的形式来展示的
怎么样,简答嘛?
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有