Excel VBA 7.36跨工作表对数据按类求和,你还在敲计算器?

一起学习,一起进步~~

关于工作表数据的合并写的有点多,超出预料之外的,除了自己本身计划的,后面也是陆续增加了很多小伙伴们的各种特殊要求,说明大家对于数据合并的需求还是很大的,小伙伴们有空了可以去阅读下历史文章哦

今天我们正是进入关于工作薄数据汇总求和的相关小类中,今天我们要分享的跨工作表已行为单位,进行数据的求和计算,并且将结果返回到一个新建工作表中。

场景简介

假设我们现在有这样的一个工作薄数据

有三个工作表,并且每个工作表的顺序和数量都不尽相同,那么我们需要如何进行汇总呢?

代码区

来看看代码~,这个案例也是我们之前学习的过程中使用的案例,我们来看看如何通过代码来实现我们的效果

方法依然是我们很熟徐的字典+数组

Sub TEST()Dim sth As Worksheet, zd As Object, arr()Set zd = CreateObject("scripting.dictionary")j = 0For Each sth In Worksheets l = sth.Cells(Rows.Count, 1).End(xlUp).Row l1 = sth.Cells(2, Columns.Count).End(xlToLeft).Column For i = 3 To l k = sth.Cells(i, 1) If zd.Exists(k) Then n = zd(k) For i1 = 3 To l1 arr(i1, n) = arr(i1, n) + sth.Cells(i, i1) Next i1 Else j = j + 1 zd(k) = j ReDim Preserve arr(1 To l1, 1 To j) For i1 = 1 To l1 arr(i1, j) = sth.Cells(i, i1) Next i1 End If Next iNext sthWorksheets.AddSet sthn = ActiveSheetsthn.Name = "最终统计结果"sthn.Cells(2, 1).Resize(UBound(arr, 2), UBound(arr)) = WorksheetFunction.Transpose(arr)End Sub

程序运行之后,看看结果

我们可以看到A1只有第二个和第三个表才有,所以他虽然在第一个表中无数据,但是统计到了后面两个表格的数据,同样的情况也出现在A8上面

这样我们就轻松的实现了单个工作薄下多个工作表不规则数据的求和汇总了。

代码分析

这里虽然还是运用字典+数组的组合,但是和之前的方法又有一些不同,大家需要好好静下来理解下

我们是按照单元格的列名,就姓名的内容来进行汇总的,所以我们在遍历每个工作表的时候,同时循环工作表的第一列,将第一列的内容作为字典的键

那么有了键,如何赋值呢?

对应的值就是他在整个字典中的位置,我们在第一次循环的时候,字典是空的,所有都是不存在的情况,来看看实际执行的效果

我们按照工作表从上往下的顺序进行遍历,A10正好在第6个位置,我们这个就直接将A10这个键,在字典中的值=6

相对的,数组中arr的第6行的内容正好也就是A10的数据

然后进入今天比较烧脑的地方了。

进入第二个工作表,当成循序到A5这个姓名的时候,我们会发现字典中已经存在了,因为在第一个工作表中已经有A5的数据了,那么这个时候我们就需要相加了。如何相加?

我们首先需要知道在第一个表中A5的所有数据,那么棕地第一个表中A5的数据在数组中的位置是哪一个呢?

n = zd(k)

因为我们在之前已经设置了

zd(k) = j

来设置A5的值,之前是等于几,就是在数组中第几个位置,我们还是用A10来详细看下代码

不管表中A10是在第几行,之前的数组中A10的位置始终都是在第6位,所以这个时候我们就可以将数组中第6行的数据和实际工作表中A10所在的行的数据想家了。

For i1 = 3 To l1 arr(i1, n) = arr(i1, n) + sth.Cells(i, i1) Next i1

其他的都是依次类推,最终就得到了我们想要的结果了。

留一个小尾巴给大家,为什么我们这里的循环都是从3开始的,而不是从1或者是2呢?有答案的小伙伴们就在下面留言吧

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

(0)

相关推荐