Excel VBA 5.25一个工作簿内有多个工作表 还要规避干扰字段
一起学习,一起进步~~
上一节呢,我们学习了针对工作簿字段内容不同,顺序也不同的情况下的数据汇总的操作,在那节发表之后呢,也有一些小伙伴私信我说,上一节的代码还存在着一些问题,比方说
1.虽然我们成功的汇总了数据,但是仅仅是针对一个工作簿有一个工作表的情况下汇总的,如果一个工作簿有多个工作表,这个代码还需要在扩展下
2.虽然成功的汇总了数据,但是很明显,数据是汇总了,但是一眼看下去,并不知道数据是哪里来的,后期校对数据的话,也非常的头疼。
仔细想想,大家说的还非常有道理的,那么针对上面的两个问题呢,我们今天就来继续完善下
最终实现的效果是:
1.增加针对多工作表的汇总
2.在汇总的数据中,增加数据来源, 方便后期的校对
场景说明
OK,既然已经有了目标了,那就很好办了
直接看看怎么实现
第二点,增加数据来源非常简单,我们在最终写入数据的时候,我们在增加两列,分别写入工作簿的名称和工作表的名称即可。
第一点,针对多个工作表的数据汇总,那么就是要遍历循环工作表了。
这个是我们后面第7章的重点。
先来说下,工作表的遍历,其实和工作簿的遍历一样,都是利用for each 循环就可以实现了。
非常的简单
那么,直接上代码吧。
代码区
Sub test24()
Application.DisplayAlerts = False
Dim sth As Worksheet, sth1 As Worksheet, rng1 As Range, rng As Range, sbook As Workbook, sb As Workbook, arr, arr1, arrt()
Set sbook = ThisWorkbook
pathn = ThisWorkbook.Path
Set sth1 = ActiveSheet
Set rng1 = Application.InputBox("请选择表头区域", "表头区域的确认", , , , , , 8)
arr1 = rng1
len1 = UBound(arr1, 2)
f = Dir(pathn & "\")
Do While f <> ""
l1 = Cells(Rows.Count, 1).End(xlUp).Row
If f <> "5-25.xlsm" Then
For Each sb In Workbooks
If sb.Name = f Then
GoTo line
End If
Next sb
Workbooks.Open (pathn & "\" & f)
For Each sth In ActiveWorkbook.Worksheets
sth.Activate
l = Cells(1, 1).End(xlDown).Row
With ActiveSheet.UsedRange
arr = .Rows(1)
l2 = UBound(arr, 2)
Set rng = .Find(What:="合计", LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlPrevious)
rngRow = rng.Row
End With
If l > rngRow Then
For i = 1 To l2
On Error Resume Next
num = WorksheetFunction.Match(arr(1, i), arr1, 0)
If Err.Number = 0 Then
ReDim Preserve arrt(1 To rngRow - 2, 1 To len1)
For j = 1 To rngRow - 2
arrt(j, num) = Cells(j + 1, num)
Next j
End If
Next i
Else
For i = 1 To l2
On Error Resume Next
num = WorksheetFunction.Match(arr(1, i), arr1, 0)
If Err.Number = 0 Then
ReDim Preserve arrt(1 To l - 1, 1 To len1)
For j = 1 To l - 1
arrt(j, num) = Cells(j + 1, i)
Next j
End If
Next i
End If
l1 = sth1.Cells(Rows.Count, 1).End(xlUp).Row
sth1.Cells(l1 + 1, 1).Resize(UBound(arrt), 1) = ActiveWorkbook.Name
sth1.Cells(l1 + 1, 2).Resize(UBound(arrt), 1) = ActiveSheet.Name
sth1.Cells(l1 + 1, 3).Resize(UBound(arrt), len1) = arrt
Erase arrt
Next sth
ActiveWorkbook.Close True
End If
line:
f = Dir()
Application.DisplayAlerts = True
Loop
End Sub
代码又增加了一些,是不是很方呢?
其实不用方,因为我讲解的思维都是循环渐进,由易而难的,所以本节的代码虽然长,但是基本上是在上一节的代码的接触上新增了一点点代码而已。并不难。
掌握方法才是最重要的
只有掌握了 方法,才可以针对现有的代码进行改动,你才知道要改动哪里,增加哪里。
其实今天就增加了上面这么短短的两部分的代码,并不负责,先来看看最终的效果。
代码解析
这样的效果应该是非常的完美了。
有了工作簿和工作表名称,这样就有了数据源,方便后期的更改和校对
同时也实现了针对多个工作表的处理。
因为大致的框架逻辑都是我们之前的框架,所以,这里我们就直接针对今天新增的部分进行讲解。
首先,我们要求非常的明确,需要针对多个工作表进行循环
工作表是什么呢?工作表和工作簿又有什么区别呢?
容我偷个懒,放个之前章节的原图
换成代码就是
工作簿:workbook
工作表:worksheet
想要遍历工作表呢。依然是我们熟悉的for each循环
for each sth in ActiveWorkbook.Worksheets
注意:
这里的ActiveWorkbook.Worksheets,后面一定要带's',他代表的就是所有的工作表的集合。
遍历每个工作表,去寻找数据的方法,和上一节就完全一样了,代码都没有做任何的改动。
唯一不同的就是最后写入的时候,要增加工作表名称
这里我们不打乱数组的布局,直接在最后写入
其实也可以在上面的数组中写入,不过这样处理数组就比较的麻烦
这里我们保持代码的连贯性,所以选择在最后直接一次性写入,更加的方便移动
============================
本节课的案例源码已经上传,需要的小伙伴后台私信“5-25-W6”,希望大家多支持~~,多多关注 ~ ~
好了,明晚21:00,准时再见!
因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。