Excel VBA 每日一场景 利用字典方式 区分大小写的去重计数

Excel VBA 每日一场景 利用字典方式 区分大小写的去重计数
2021年04月22日 21:00 晓雯子16

今天我们的场景是数据的去重并计数

说到这样的场景,很多的小伙伴一定会首先想到使用字典,没错,在这样的场景下,如果通过代码的方式来实现的话,那么首选一定是字典了。

但是这里又有很多的小伙伴会提出疑问,去重并计数,不是 可以直接用透视表嘛?为什么还要那么麻烦的去写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

这个是什么意思呢?

他是想的及时数组的转置,就相当于将一行数组,转变成一列数组,因为我们要一列的形式来展示的

怎么样,简答嘛?

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部