打开APP
userphoto
未登录

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

开通VIP
Excel VBA 5.21 新番 活用字典方法 轻松应对字段不同的工作簿求和

一起学习,一起进步~~

上两节的时候,我们学习了利用字典+数组的方法来实现工作簿的数据求和操作,通过这个方法,我们可以直接针对工作簿的内容进行计算,而不需要先合并工作簿,然后在针对合并后的工作簿展开计算了,这样可以节省我们不少的时间

而之前两节我们的方法都是字典搭配数组的方法,同时进行的,效果也是非常的不错。

今天我们在针对小伙伴提出的另外一个场景来进行处理,今天小伙伴给出的场景是,工作簿的字段不同的求和。

场景模拟 

比方说这样的场景,这是字段不同的场景,其实我们之前也是学习过类似的场景的处理,在之前我们是使用数组的方式来实现了,借用了数组的MATCH方法

那么今天我们来换种方法,我们用纯字典的方法来实现这样的效果

这样大家面对这个场景的时候,就可以选择使用两种方法来进行处理了。

灵活性和通用性就更高了。

代码区

Sub test()Dim zd As Object, pathn, arr(), arr1, sgm(), zxl(), brr()pathn = ThisWorkbook.PathSet zd = CreateObject("scripting.dictionary")f = Dir(pathn & "\")k = 0k1 = 0Do While f <> ""If f <> "5-9-3.xlsm" Then Workbooks.Open pathn & "\" & f l = Cells(Rows.Count, 1).End(xlUp).Row arr1 = ActiveSheet.UsedRange For i = 2 To l For j = 2 To UBound(arr1, 2) s = Cells(i, 1) & arr1(1, j) If zd.Exists(s) Then zd(s) = zd(s) + Cells(i, j) Else zd(s) = Cells(i, j) End If Next j Next i ActiveWorkbook.Close TrueEnd Iff = Dir()Loopsgm() = zd.keys()zxl() = zd.Items()zl = zd.CountActiveSheet.Cells(1, 1).Resize(zl, 1) = WorksheetFunction.Transpose(sgm())ActiveSheet.Cells(1, 2).Resize(zl, 1) = WorksheetFunction.Transpose(zxl())End Sub

相较于之前的代码,今天的代码,简短了很多,但并不是说字典一定就比数组简单,主要看不同的场景的,在今天的这个场景中,字典明显要比数组简单,好理解一点。

先来看看代码执行的效果

代码也是很轻松的就得到了我们想要的结果

不过这里肯定会有小伙伴疑惑了,这样结果似乎不尽完美,没关系,我们后面会稍微处理一下就可以了。

代码分析

既然今天我们没有使用数组的方法,而使用字典的方法,那么我们的思路就应该变更一下,就不应该用数组的思路

之前使用数组的时候,我们先去判断字段的位置,有了字段的位置之后,我们在针对每一列进行求和,当然这样的方法在今天的场景中可能就不实用了。

因为我们仔细观察下数据,我们会发现,不仅仅是行标头不同,列表头也不同

这样用数组,就会导致数据出现偏出了,那么这样一来,好像我们也只能使用字典了。

那么来看看字典是如何实现的。

要使用字典的话,那么在字典中一定要有一个唯一值的存在,那么在今天这样的场景中,如何去构造一个唯一值是关键。

在上一节,我们学习了通过连字符的方式,将两列合并成为一个列,作为一个整体参加字典的循环的方法,那么在今天还可以这样用嘛?

完全可以!

不过我们要稍微变更一下

今天我们并不是将两列合并成为一个列,今天我们是要将一行和一列循环构造成为一个整体,如上图

我们要做的就是将姓名和学科,一次形成一个组合,比方说A1的语文成绩,那么就是“A1语文”“A1数组”这样的结构,也就是大家在上面的gif动图中,看到的结果

这样一来,我们就不需要去判断姓名所对应的成绩是在第几列,第几行这样的问题,通过姓名和学科组成了一个唯一值之后,就可以进行字典去计算了,

再次循环到下一个表的时候,比方说A1语文的成绩,就将字典中A1语文的成绩进行累加即可,彻底的回归到字典的方式

上面这个判断也是字典的常用方法,在之前的学习中,我们也是学习了

那我们继续往下走,通过几次的循环累加之后,我们现在已经有了一个字典了,现在的问题就是,如何将字典的内容写入Excel呢?

这个问题,和当初我们得到了数组之后,如何将数组写入Excel一样,也是最为重要的一步。

我们这里来看看字典要如何实现

sgm() = zd.keys()zxl() = zd.Items()zl = zd.Count

先来看看这三段代码

分别是将字典的键,字典的值写入到一个数组当中,同时获得字典的总个数

还不清楚?来看看下面的图

这样是不是很清楚了,这个方法是不是和之前数组的写入又有几分相似,那么大家这样一对比,应该会好理解很多了吧。

那么有了这两个是数组之后,写入Excel的方法,是不是就很简单了呢?

ActiveSheet.Cells(1, 1).Resize(zl, 1) = WorksheetFunction.Transpose(sgm())ActiveSheet.Cells(1, 2).Resize(zl, 1) = WorksheetFunction.Transpose(zxl())

相信很多的小伙伴们,对于这样的结果肯定是非常不满意的,这样的结果,都在两列,并不是我们想要的结果,没关系,我们稍微对结果进行处理一些就可以了。

来看看下

将最终的结果,交给Excel自带的功能就可以轻松实现啦。

====================

本节课的案例源码已经上传,需要的小伙伴后台私信“5-21-QM”,希望大家多支持~~,多多关注 ~ ~

好了,明晚21:00,准时再见!


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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
完全手册Excel VBA典型实例大全:通过368个例子掌握
活用数组 字典的组合,轻松实现Excel自身没有的功能
使用VBA按某列中的关键字拆分为单独的工作簿
Excel 字典实例
[VFP实例]VFP的OLE技术应用详解
“VBA”学习笔记
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服