Excel VBA 5.20 新番 工作簿汇总求和新难题 参照物两列如何处理
前景提要
本章最开始的时候,我们学习了一些关于工作簿合并的操作,然后我们也学习了工作簿的计算,就是在合并数据的同时,直接进行简单的数据求和

这是我们之前学习的场景,遍历循环多个工作簿,按照姓名来求和,我们使用到的是数组和字典两种不同的方法。
之后其实有小伙伴们给我提出了一个新的场景,比方说,当前我们计算的工作簿的参照物并不是单单姓名这一列,有两列

比方说这样的,工作簿中有多了一个班级列,并且要求也变了,只有在班级和姓名都不相同的情况下,才判定是两个人,比方说A1的名字比较普通,有两个人都是叫这个名字,但是刚好又在不同的班级,所以这个时候难度有增加了,我们需要判断将两列作为参照物,那么我们要如何来实现呢?
场景模拟
其实,虽然增加了一列,两列作为参照物,看表面,疏忽判断难度增加了不少,既要判断姓名,又要判断班级,只有在两者都不相同的情况,才可以行累加
说起来是难度增加了很多,但是实际上呢?
我们换个思路,上一节我们学习的是根据一列来进行累加,那么我们能不能往上一节的模式中套呢?
来看下代码,看看我是如何套用上节的思路和代码的
代码区
Sub test()
Dim zd As Object, pathn, arr()
pathn = ThisWorkbook.Path
Set zd = CreateObject("scripting.dictionary")
f = Dir(pathn & "\")
k = 0
Do While f <> ""
If f <> "5-9.xlsm" Then
Workbooks.Open pathn & "\" & f
l = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To l
s = Cells(i, 1) & "-" & Cells(i, 2)
If zd.Exists(s) Then
n = zd(s)
arr(3, n) = arr(3, n) + Cells(i, 3)
arr(4, n) = arr(4, n) + Cells(i, 4)
arr(5, n) = arr(5, n) + Cells(i, 5)
arr(6, n) = arr(6, n) + Cells(i, 6)
Else
k = k + 1
zd(s) = k
ReDim Preserve arr(1 To 6, 1 To k)
arr(1, k) = Cells(i, 1)
arr(2, k) = Cells(i, 2)
arr(3, k) = Cells(i, 3)
arr(4, k) = Cells(i, 4)
arr(5, k) = Cells(i, 5)
arr(6, k) = Cells(i, 6)
End If
Next i
ActiveWorkbook.Close True
End If
f = Dir()
Loop
ActiveSheet.Cells(2, 1).Resize(k, 6) = WorksheetFunction.Transpose(arr)
End Sub
我们来看看最终的效果

成功的实现了数据的累计,并且按照我们的要求,将姓名和班级,两列作为参照列,来区分判断。
代码分析
我们来看看代码
上面我们也说了,我们的思路是往上一节的模板中套用,那么来看看我们是如何套用上节的思路的
首先,我们都知道,上节是常规的数据,只有一列作为参照列,而今天,我们有两列,那么两列如何合并成为一列呢?
注意我的关键词,合并。
s = Cells(i, 1) & "-" & Cells(i, 2)
看,代码中就是这样非常简单的一句话,将两个单元格合并成为了一个单元格

这样做的目的是什么呢?
将两列合并成为一列,作为一个整体来进入字典,判断是否存在这样一个整体。
比方说A1,他分别在一班,二班都有出现,那么通过我们这样一操作,
就变成了“A1-一班”,'A1-二班’
这样将这一段文本当成一个整体来判断,就可以抛开A1是在哪个班级的问题了。

后面的代码中,我们也是将S整个合并后的内容,作为一个整体带入字典,进行判断的,这样就可以成功的规避两个班级中出现同名的情况了,也可以绕开需要同时判断两个参数的情况,节省了代码量,思路也是更加的清晰明了。