分享

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

 kelvin_huang 2019-06-01

前景提要(数组汇总数据 速度快不卡顿,多调试就能理解)

昨天我们分享了如何将多个Excel 工作薄内的多个工作表数据按照工作表的名称合并到一个工作表的方法,通过这个方法在合并一些规则数据的时候,就不用再去手工复制粘贴了,节省了我们很多的时间,不过也有小伙伴们表示,虽然全部数据合并在一起看起来是非常的方便,但是有时候我们的工作表数据并不仅仅是只有那么两三列,而且有时候很多数据并不是我们需要的,我们只需要其中的几列数据而已,这个时候我们就应该指定列来进行合并,其他无关的数据我们就不合并了。

场景模拟

在之前我们使用的案例中,有一列是总分的数据,但是在实际的数据分析中,总分这一列并没有太大的价值,我们需要分析的是每一门学科的成绩,以此来了解大家学习的成果,并针对弱点来进行补强,所以总分毫无价值

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

那么实际上,我们只需要合并这三列数据就可以了,完全不需要总分这一列的数据。上节我们是将所有的数据都合并的,那么这次,我们就进行有针对性的合并

代码区

按照列来进行合并数据,其实在之前我们分享合并单个工作薄的多个工作表的时候就已经讲述过了,现在多个Excel工作薄,其实也是差不多的方法

如果在之前的学习中,大家已经掌握了方法的话,那么本节就比较简单了,如果还没有掌握也没关系,本节我们继续学习

来看代码

Sub test()Dim rng As Range, sth As Worksheet, arr(), book As WorkbookSet book = ActiveWorkbookSet rng = Application.InputBox('请选择要合并的列名', '表头的确定', , , , , , 8)pathn = ThisWorkbook.Pathf = Dir(pathn & '\')Do While f <> '' If f <> '汇总.xlsm' Then Workbooks.Open pathn & '\' & f For Each sth In Worksheets l = Cells(Rows.Count, 1).End(xlUp).Row On Error Resume Next maxl = UBound(arr, 2) k = 0 For Each a In rng k = k + 1 num = a.Column ReDim Preserve arr(1 To rng.Columns.Count, 1 To maxl + l - 1) For i = 2 To l j = j + 1 arr(k, j) = sth.Cells(i, num) Next i If k <> rng.Columns.Count Then j = maxl End If Next a Next sth Else Exit Do End If ActiveWorkbook.Close Falsef = Dir()Loopbook.Worksheets('汇总').Cells(2, 1).Resize(UBound(arr, 2), rng.Columns.Count) = WorksheetFunction.Transpose(arr)End Sub

代码并不算是很长,采用了大家比较喜欢的数组方法,因为有不少小伙伴们说想看看数组的玩法,小编就满足大家的需求

看看效果

我们先常见一个汇总表,然后将标题复制过来,并且然后在这个表中进行操作筛选标头

首先我们先确定表头

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

然后程序会会自动遍历所有的当前文件夹的execl工作表,并且汇总所有的工作薄中的所有工作表的相关字段的数据,这里采用的是数组的形式,所以运行速度相对会比之前直接复制粘贴要快很多,最后直接一次性写入。

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

成功的将所有的工作表中的指定字段的数据都复制到了一起,其他的字段就不会被复制过来了。

比方说总分的字段相关数据就不会被展示出来了。

代码分析

首先我们这里声明一个数组

然后我们尝试获得数组的最大下标

maxl = UBound(arr, 2)

获得数组最大下标的目的就是方便我们后面对数组进行不断的递增,比方说统计完A表之后,数组已经有了A表的所有数据,然后我们要统计下一个表的数据了,这个时候我们就需要在现在数组的最大下标的基础上,再去加上新的数据,所以这里我们需要获得一个最大下标作为参考

因为我们这里的是规则数据,所以刚刚获取的标头的位置也就等于其实际在工作表中的位置,所以我们直接获得每个表头的列数就可以了。

num = a.Column

然后重置一个动态数据,最大下标就是当前数组的最大下标+ 当前工作表的总行数

ReDim Preserve arr(1 To rng.Columns.Count, 1 To maxl + l - 1)

后面就可以赋值了,然后又是一个比较绕的关键点了。

For i = 2 To l j = j + 1 arr(k, j) = sth.Cells(i, num) Next i

循环遍历当前工作表的所有行,动态数组的每一列的值,就等于标头所在列的每一行数据

看看实际执行效果

当前我们汇总姓名这一列的数据,看看数组

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

此时我们看看vba这一列就是数组的第二列的状态

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

因为我们正在处理第一列的数据,所以后面的第二列,第三列的数据都是空值,如果我们继续执行程序,运行到第二列就是VBA这个标头的时候呢?

再看看

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

这里我们就成功的得到了第二列的数据,

依次类推第三列也是如此

然后循环到下一个表的时候,我们就将数组的最大小标增加,增加多少呢?当前工作表的总行数,来看看效果

之前汇总第一个表的时候,我们看到最大下标是10 ,也就是工作表总共10行(不算标题行)

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

进入下一个列表之后,因为是规则数据,我们可以估算出,应该也是10行,那就是总共20行数据

Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确

实际确实是这样

后面的循环的过程就是一样的逻辑了,大家可以自己实际动手调试下,数组是一个比较抽象的概念,之所以不愿意太早涉及数组,就是因为比较抽象,不太好理解,如果没有基础的话,可能就比较难看懂,但是部分小伙伴们有想要知道,小编就先放出数组的写法吧。

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

好了~明晚19:00,准时再见。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多