Excel VBA 7.20 Excel跨工作薄多工作表数据合并之Excel表格多行/单行表头共存
一起学习,一起进步~~
发现小伙伴们的数据结果真的好复杂,复杂到我都想要哭了,这不昨天才分享过有多行表头的数据如何汇总合并,今天就有小伙伴反馈,他的数据虽然是有多行表头的,但是又有一些数据没有多行表头,那么在进行批量数据汇总的时候,应该如何操作呢?
场景模拟
碰到问题,我们首先想象,如果手工操作的话,我们会如何操作呢?
通过对比我们发现了不管数据如何的变化,每一个Excel报表肯定都会有字段名称的,那么我们按照这一行作为参考标准,这一行往下都是数值区域,往上都是标题区域
来试下
代码区
按照我们前面所说的这些思路,我们首先需要确定的就是字段名称所在的那一行的行数,如果依然使用上节我们分享的那种方式,在第一个打开的工作薄中来确定,明显就不合适了。
因为我们不能保证每次打开的第一个Excel报表一定是多行表头的,所以这里我们实行曲线救国,先在汇总表中将表头复制过来,我们直接在这个汇总表中进行确定
Sub ss()
Dim rng As Range, sth As Worksheet, trng As Range, arr, tsth As Worksheet
Set tsth = ActiveSheet
Set rng = Application.InputBox("请选择字段名所在行", "字段名区域的确定", , , , , , 8)
arr = rng
pathn = ActiveWorkbook.Path
f = 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 If
f = Dir()
Loop
End 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
之后就是简单的复制粘贴了,小伙伴们应该能够轻松驾驭了。
============================================