Excel VBA 每日一场景 利用字典方式 区分大小写的去重计数
利用字典方式 区分大小写的去重计数
点击上方“Excel和VBA”,选择“置顶公众号”
致力于原创分享Excel的相关知识,源码,源文件打包提供
一起学习,一起进步~~
今天我们的场景是数据的去重并计数
说到这样的场景,很多的小伙伴一定会首先想到使用字典,没错,在这样的场景下,如果通过代码的方式来实现的话,那么首选一定是字典了。
但是这里又有很多的小伙伴会提出疑问,去重并计数,不是 可以直接用透视表嘛?为什么还要那么麻烦的去写VBA?
我们来看看今天的场景

留意到今天的数据源中,有两个数据源是非常的相似的,一个是大写的A1,一个是小写的a1,某些场合中,这两种不同的数据是代表着不同的意义的,那么在去重计数的时候,要分来来统计,但是透视表呢?就不行

我们可以看到传统的数据透视表呢,并不能够区分大小写,会将这两个混为一谈,统计出来的效果是错误的
所以在这样的情况下,我们还是要利用VBA的了。
那么VBA的那种方法呢?
其实字典并不是唯一选择,可以是字典,可以是集合,也可以是SQL
我们这里就来学习下字典的方法,因为数据只有一列,所以可以说是非常基础的字典的写法
对于字典还不太熟悉的小伙伴,可以好好的琢磨下这篇文章
直接来看代码
Sub ddd()Dim sgm(), zxl()Set zd = CreateObject("scripting.dictionary")zd.CompareMode = 0For i = 2 To 79 k = Cells(i, 1) If zd.exists(k) Then zd.Item(k) = zd.Item(k) + 1 Else zd.Add k, Int(1) End IfNext izl = zd.Countsgm() = 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非常的简单,也是字典的最基本的写法
我们来看看最终的效果是如何的

很快就得到了我们想要的结果,效果非常的不错
成功的将小写和大写区分出来了,并且也是统计了相应的格式
一起来看看这个字典的写法吧
字典在使用之前,需要先申明一个变量,用这个变量来装字典。
Set zd = 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
这个是什么意思呢?
他是想的及时数组的转置,就相当于将一行数组,转变成一列数组,因为我们要一列的形式来展示的

怎么样,简答嘛?
好了,明晚21:00,准时再见!
因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。
