打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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,准时再见!


因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
学习VBA,报表做到飞 第二章 数组 2.3 Split与Join
VBA常用小代码302:一个简单的单条件数据查询问题
Excel中字典应用综合示例
可以生成数组的函数,数组的处理
VBA: 字典的介绍与实例
带您走进VBA数组7
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服