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

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

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

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

场景模拟 

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

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

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

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

代码区

  Sub test()

  Dim zd As Object, pathn, arr(), arr1, sgm(), zxl(), brr()

  pathn = ThisWorkbook.Path

  Set zd = CreateObject(“scripting.dictionary”)

  f = Dir(pathn & “\”)

  k = 0

  k1 = 0

  Do 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 True

  End If

  f = Dir()

  Loop

  sgm() = zd.keys()

  zxl() = zd.Items()

  zl = zd.Count

  ActiveSheet.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())

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

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片