Excel VBA 7.20 Excel跨工作薄多工作表数据合并之Excel表格多行/单行表头共存

一起学习,一起进步~~

发现小伙伴们的数据结果真的好复杂,复杂到我都想要哭了,这不昨天才分享过有多行表头的数据如何汇总合并,今天就有小伙伴反馈,他的数据虽然是有多行表头的,但是又有一些数据没有多行表头,那么在进行批量数据汇总的时候,应该如何操作呢?

场景模拟

碰到问题,我们首先想象,如果手工操作的话,我们会如何操作呢?

通过对比我们发现了不管数据如何的变化,每一个Excel报表肯定都会有字段名称的,那么我们按照这一行作为参考标准,这一行往下都是数值区域,往上都是标题区域

来试下

代码区

按照我们前面所说的这些思路,我们首先需要确定的就是字段名称所在的那一行的行数,如果依然使用上节我们分享的那种方式,在第一个打开的工作薄中来确定,明显就不合适了。

因为我们不能保证每次打开的第一个Excel报表一定是多行表头的,所以这里我们实行曲线救国,先在汇总表中将表头复制过来,我们直接在这个汇总表中进行确定

Sub ss()Dim rng As Range, sth As Worksheet, trng As Range, arr, tsth As WorksheetSet tsth = ActiveSheetSet rng = Application.InputBox("请选择字段名所在行", "字段名区域的确定", , , , , , 8)arr = rngpathn = ActiveWorkbook.Pathf = Dir(pathn & "\")Do While f <> "" If f <> ThisWorkbook.Name Then Workbooks.Open pathn & "\" & f For Each sth In Worksheets l = tsth.Cells(Rows.Count, 1).End(xlUp).Row With sth.UsedRange Set trng = .Find(arr(1, 1), , , xlPart) If Not trng Is Nothing Then num = trng.Row sth.UsedRange.Offset(num, 0).Copy tsth.Cells(l + 1, 1) End If End With Next sth ActiveWorkbook.Close False End Iff = Dir()LoopEnd Sub

看看执行效果

先确定字段名所在的行,注意,这里只需要选择字段名所在的行就可以了,上面的部分不管有多少行,都不需要选择

然后程序就会自动执行脚本,来看看最终的结果

为了更好的展示效果,我对数据源,唯一的一个单行表头的工作薄的姓名列做了修改,方便区分

我们来看看他的数据

一个不拉的出现在了准确的地方。

其他的数据也全部正确的展示出来了。

完美

代码分析

大部分的代码,相信小火把门现在都能够看懂了,今天设置到一个新的知识点,是有关于单元格内容查找的,本来这个应该是放在后面单元格系列来说的,今天既然用到了,就先提前预热分享下

With sth.UsedRange Set trng = .Find(arr(1, 1), , , xlPart) If Not trng Is Nothing Then num = trng.Row sth.UsedRange.Offset(num, 0).Copy tsth.Cells(l + 1, 1) End If End With

来看看这段代码

range.find(what,,,,,,xlPart)

这一段代码就是单元格内容查找的代码,相当于我们日常工作中,通过ctrl+F调出来的查找窗口

查询之后,如果找到trng肯定不会是空值,如果是空值就证明不存在这个字段,说明数据更加复杂,需要另外找捷径了。

If Not trng Is Nothing Then

此代码就是判断单元格是否为空

如果不为空,通过之前学习的rng.rows就可以得到他所在行了。

num = trng.Row

之后就是简单的复制粘贴了,小伙伴们应该能够轻松驾驭了。

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

(0)

相关推荐