前景提要最近我们都在学习工作簿的汇总和合并操作,不过可能是因为我的大脑细胞比较有限,所涉及的场景比较少,小伙伴们也是提出了一些新的场景要求,所以,这里我们作为新番的形式,和大家分享。 好,进入正题,今天我们要合并的工作簿的场景呢,是这样的 有空行,又有合计字段,还有最后还有合并单元格的页尾。 当然我们并不需要合并这些空行,页尾了,我们需要的仅仅是中间的数据部分,那么面对今天这样的场景,我们要如何合并呢? 场景说明既然已经有了空行,那么我们这里肯定不能使用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,准时再见! 因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。
|
|
来自: Excel和VBA > 《Excel和VBA知识》