Excel VBA 5.23 新番 工作簿含有空行、合计行如何汇总
前景提要
最近我们都在学习工作簿的汇总和合并操作,不过可能是因为我的大脑细胞比较有限,所涉及的场景比较少,小伙伴们也是提出了一些新的场景要求,所以,这里我们作为新番的形式,和大家分享。
好,进入正题,今天我们要合并的工作簿的场景呢,是这样的
有空行,又有合计字段,还有最后还有合并单元格的页尾。
当然我们并不需要合并这些空行,页尾了,我们需要的仅仅是中间的数据部分,那么面对今天这样的场景,我们要如何合并呢?
场景说明
既然已经有了空行,那么我们这里肯定不能使用Useadrange了,因为这个时候的使用区域,明显包含了空行和页尾的那些部分
而我们需要的仅仅是中间的核心数据。
不过我们可以观察到,数据中既然有合计字段,合计字段是数据源和其他的页尾标识区域的分水岭
发现了这一点,那么问题就简单了很多了,我们只需要获得合计这个字段所在的单元格行数,然后就可以将整个数据源一分为二了。
一分为二之后呢?
我们就会得到两个区域,从上图中可以看到,有些区域是有空行的,那么这样的情况下,又要如何操作呢?
so easy!
你获得A列的最后一个非空单元格不就可以了吗?
如果非空单元格的行数大于合计的行数,那就是说明有空格了。
OK,有了思路,那么直接看代码
代码区
Sub test23()
Dim sth As Worksheet, rng As Range, urng As Range, sbook As Workbook, sb As Workbook
Set sbook = ThisWorkbook
pathn = ThisWorkbook.Path
f = Dir(pathn & "\")
Do While f <> ""
l1 = Cells(Rows.Count, 1).End(xlUp).Row
If f <> "5-23.xlsm" Then
For Each sb In Workbooks
If sb.Name = f Then
GoTo line
End If
Next sb
Workbooks.Open (pathn & "\" & f)
l = Cells(1, 1).End(xlDown).Row
With ActiveSheet.UsedRange
Set rng = .Find(What:="合计", LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlPrevious)
rngRow = rng.Row
End With
If l > rngRow Then
Set urng = Range(Cells(2, 1), Cells(rngRow - 1, 5))
urng.Copy sbook.Worksheets(1).Cells(l1 + 1, 1)
Else
Set urng = Cells(2, 1).Resize(l - 1, 5)
urng.Copy sbook.Worksheets(1).Cells(l1 + 1, 1)
End If
ActiveWorkbook.Close True
End If
line:
f = Dir()
Loop
End Sub
看看效果
代码解析
OK 直接进入代码
其实说到底,今天的代码并没有太多的知识点
都是我们之前套用的模板,不过这里稍微做了一点修改而已
VBA最大的好处,就是这里,一个轮子,可以循环使用多次,只要场景对的上就OK
今天主要来学习一个方法,就是单元格的查找
Set rng = .Find(What:="合计", LookIn:=xlValues, _ LookAt:=xlWhole, SearchDirection:=xlPrevious)
就是他
单元格的查找,大家肯定非常的熟悉,CTRL+F谁不会呢?
不过今天我们的这个查找,有点意思,他是倒序查找,从单元格UsedRange的最后面往前面找
这样的好处是什么呢?
我们可以看到合计都是出现在页尾的,那考虑到数据量的问题,肯定是从最后面查找的更快啦,从前面要遍历的单元格,可能会很多,导致代码执行时间过长,所以这里是执行的倒序查找。
找到了这个合计之后,就可以按照我们上面说的,和A列的最后非空单元格进行对比了。
如果大于
合计这一行,往上移动一行,所得到的这个区间,就是我们要的核心数据
如果小于
那就和合计的位置没有关系了,直接去最后一个非空单元格网上的一个连续区域即可。
本次的代码看起来很简单,但是思路和方法才是最重要的,当然方法也不是唯一的,小伙伴们有什么其他的思路呢?
本节课的案例源码已经上传,需要的小伙伴后台私信“5-23-X1”,希望大家多支持~~,多多关注 ~ ~
好了,明晚21:00,准时再见!
因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。