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

(0)

相关推荐