VBA字典实例-统计每个广告的投放地数量

2016年12月28日08:57:19VBA字典实例-统计每个广告的投放地数量已关闭评论 3,777 views
微信公众号 【EXCEL880】 QQ群【341401932】
课程咨询 加我微信EXCEL880B 试学网址http://v.excel880.com

除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www.zhanzhanrufeng.com/cat4/182.html

昨天我们讲了字典的用法,今天我们来看一个字典应用的实例。题目要求是这样的,手上有一个地铁各站广告牌投放的统计表,如下图

字典实例-统计每个广告的投放地数量

上面的统计是有重复的,现在需要将每个广告牌投放了多少个地方统计出来。用字典可以比较容易解决这个问题,当然这里只是为了示范字典的用法,并不是说字典法就是最好的,如果这只是一次性的工作的话方法有很多,去重复再分类汇总或者用数据透视表都可以比字典快。我们之前说过用字典可以统计一个关键字出现的次数,但在这里显然有广告和投放地两个词都需要我们去判断,比如在判断A3的白发魔女时,我们还需要判断B列的东京路在之前A列是白发魔女的B列数据中是否出现过,如果没出现才能给白发魔女这个词再加1。是不是有点绕口?直接说思路可能比较好理解一点,我们需要建立两个字典对象d1与d2,d1的关键字是A列和B列的组合,d2的关键字是A列的广告。从第2行依次往下判断,如果A&B这个关键词不存在,则将其加入字典d1,并给d1中对应A列那个关键词+1,如果A&B已经存在就不做任何操作直接下一个。不明白的朋友自己想一想,我就不再多说了,直接看代码

Sub test()
Dim d1, d2, i, arr, brr
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Not d1.exists(Range("A" & i).Value & Range("B" & i).Value) Then  '如果A&B这个关键字不存在于d1中
d1(Range("A" & i).Value & Range("B" & i).Value) = ""          '将A&B放入d1中,值为空就可以
d2(Range("A" & i).Value) = d2(Range("A" & i).Value) + 1       '相应A列关键词在原值上+1
End If
Next
arr = d2.keys                'A列不重复的词
brr = d2.items               '对应个数
Range("D1").Resize(d2.Count, 1) = Application.Transpose(arr)         '一维数组转置放到D1
Range("E1").Resize(d2.Count, 1) = Application.Transpose(brr)
Set d1 = Nothing
Set d2 = Nothing
End Sub

上面的代码我只解释一句 d2(Range("A" & i).Value) = d2(Range("A" & i).Value) + 1,这句的意思是将 d2(Range("A" & i).Value)在原有值的基础上+1,这个应该不难理解,那有的朋友会问了,如果这是第一次将Range("A" & i).Value放入d2中,既原来根本不存在 d2(Range("A" & i).Value)这么个东西这句怎么理解?其实在你没给字典中加关键词时,d2(Range("A" & i).Value)返回的就是空,这个空和空值还不是一个东西,空值也是值,空就什么都没有了。那当每一次执行d2(Range("A" & i).Value) = d2(Range("A" & i).Value) + 1时就是让d2(Range("A" & i).Value)等于空加上1,那就还是1。

好了,就说这么多,本节示例文件下载http://pan.baidu.com/s/1c0pLh9u

表格 定制  数据 合并 处理 分析 VBA 编程 开发 网页