Excel VBA 7.24多个Excel报表针对某行数据进行汇总,并且要展示报表名称,你能轻松快速做到嘛?
一起学习,一起进步~~
最近有小伙伴私信我,他说在之前进行数据汇总的过程中,虽然我们成功的将几个工作薄内的标准数据成功的汇总在了一起,但是一个弊端,当所有的数据都汇总在一起的时候,有时候有些数据的内容是完全相同的, 这个时候在分析数据的时候, 就比较难以分析了,不知道这个相同的数据是真的巧合数据相同,还是因为复制的时候复制错了,如果可以在汇总数据的过程中,顺带加上工作薄和工作表的名称分别区分的话,效果会更加好。
同时也有小伙伴们想要实现针对特定的某一行数据进行合并分析的,其他的数据不要,只需要针对某一行来进行分析,我们今天将两个需求合并,一起实践下吧
场景模拟
这里我们继续使用之前的案例,当前有一个文件夹,文件夹内所有的工作薄的数据都是相同的, 并且有多个工作表,
我们现在针对其中某一行,加上A3这一行的数据进行合并,同时最终的结果中要体现工作薄的名称,以及工作表的名称,方便区分数据的来源渠道,
代码区
思路我们简单过一下,想要针对某一行进行合并,那么最直接的方法就是找到这一行所在的行数就可以了,之前我们分享过单元格的查找,本节可以继续使用,来看看代码
Sub tesrt()
Dim book As Workbook, sth As Worksheet, arr(), rng As Range, arr1
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = -1 Then
pathn = .SelectedItems(1)
End If
End With
k = 0
f = Dir(pathn & "\")
ID = Application.InputBox("请输入要统计的列名", "列名的确定", , , , , , 3)
Do While f <> ""
Workbooks.Open (pathn & "\" & f)
For Each sth In ActiveWorkbook.Worksheets
k = k + 1
l = sth.Cells(1, Columns.Count).End(xlToLeft).Column
With sth.UsedRange
Set rng = .Find(ID, , , xlWhole)
If Not rng Is Nothing Then
num = rng.Row
ReDim Preserve arr(1 To l + 2, 1 To k)
arr(1, k) = ActiveWorkbook.Name
arr(2, k) = sth.Name
For i = 1 To l
arr(i + 2, k) = sth.Cells(num, i)
Next i
End If
End With
Next sth
ActiveWorkbook.Close False
f = Dir()
Loop
ActiveSheet.Range(Cells(1, 1), Cells(1, l + 2)) = Array("工作薄名称", "工作表名称", "姓名", "VBA", "python", "总分")
ActiveSheet.Cells(2, 1).Resize(UBound(arr, 2), UBound(arr)) = WorksheetFunction.Transpose(arr)
End Sub
首先依然是选择指定的文件夹,提高通用性嘛
然后针对我们要合并的行所在的名称输入
然后坐等结果
出来了,工作薄,工作表的名称都有了,非常的完美
代码分析
今天的代码就真的比较的简单了, 基本上都是基础知识的一个活用而已
前面的都比较的简单,我们直接进入单元格查找的环节吧
Set rng = .Find(ID, , , xlWhole)
这是我们之前分享过的单元格内容的查找方法,不过和我们之前分享的方法有点不同,不同在哪里呢?
Set rng = .Find(ID, , , xlpart)
比较下,最后一个单词不同,xlpart代表的是模糊查找,即部分查找,xlWhole全部查找,就是精确查找,我们来实际操作下对比不同
假设我们现在要汇总A1这一行的数据
当前工作表并没有A1,我们执行下代码
居然num有返回值,是多少呢,10,第10行是A10,并不是我们要的A1,为什么会这样呢?
因为我们代码用的是模糊查找,A1和A10,有相同的部分,就是A1,既然A1不存在,那就是找A10了,所有才会有这样的结果
如果我们换成精确查找呢?
大家在使用的时候要根据场景灵活选择使用方法
顺组这里就非常简单了,因为是标准数组,我们在声明的时候,将前面两列的数组分别赋值为工作表名称,工作薄名称就可以了,后面的将对应的单元格中的位置赋值即可,非常的简单。
================================================