分享

Excel VBA 5.23 新番 工作簿含有空行、合计行如何汇总

 Excel和VBA 2021-04-07

前景提要

最近我们都在学习工作簿的汇总和合并操作,不过可能是因为我的大脑细胞比较有限,所涉及的场景比较少,小伙伴们也是提出了一些新的场景要求,所以,这里我们作为新番的形式,和大家分享。

好,进入正题,今天我们要合并的工作簿的场景呢,是这样的

有空行,又有合计字段,还有最后还有合并单元格的页尾。

当然我们并不需要合并这些空行,页尾了,我们需要的仅仅是中间的数据部分,那么面对今天这样的场景,我们要如何合并呢?

场景说明

既然已经有了空行,那么我们这里肯定不能使用Useadrange了,因为这个时候的使用区域,明显包含了空行和页尾的那些部分

而我们需要的仅仅是中间的核心数据。

不过我们可以观察到,数据中既然有合计字段,合计字段是数据源和其他的页尾标识区域的分水岭

发现了这一点,那么问题就简单了很多了,我们只需要获得合计这个字段所在的单元格行数,然后就可以将整个数据源一分为二了。

一分为二之后呢?

我们就会得到两个区域,从上图中可以看到,有些区域是有空行的,那么这样的情况下,又要如何操作呢?

so easy!

你获得A列的最后一个非空单元格不就可以了吗?

如果非空单元格的行数大于合计的行数,那就是说明有空格了。

OK,有了思路,那么直接看代码

代码区

Sub test23()Dim sth As Worksheet, rng As Range, urng As Range, sbook As Workbook, sb As WorkbookSet sbook = ThisWorkbookpathn = ThisWorkbook.Pathf = Dir(pathn & "\")Do While f <> ""l1 = Cells(Rows.Count, 1).End(xlUp).RowIf 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 TrueEnd Ifline:f = Dir()LoopEnd Sub

看看效果


代码解析

OK 直接进入代码

其实说到底,今天的代码并没有太多的知识点

都是我们之前套用的模板,不过这里稍微做了一点修改而已

VBA最大的好处,就是这里,一个轮子,可以循环使用多次,只要场景对的上就OK

今天主要来学习一个方法,就是单元格的查找

Set rng = .Find(What:="合计", LookIn:=xlValues, _ LookAt:=xlWhole, SearchDirection:=xlPrevious)

就是他

单元格的查找,大家肯定非常的熟悉,CTRL+F谁不会呢?

不过今天我们的这个查找,有点意思,他是倒序查找,从单元格UsedRange的最后面往前面找

这样的好处是什么呢?

我们可以看到合计都是出现在页尾的,那考虑到数据量的问题,肯定是从最后面查找的更快啦,从前面要遍历的单元格,可能会很多,导致代码执行时间过长,所以这里是执行的倒序查找。

找到了这个合计之后,就可以按照我们上面说的,和A列的最后非空单元格进行对比了。

如果大于

合计这一行,往上移动一行,所得到的这个区间,就是我们要的核心数据

如果小于

那就和合计的位置没有关系了,直接去最后一个非空单元格网上的一个连续区域即可。

本次的代码看起来很简单,但是思路和方法才是最重要的,当然方法也不是唯一的,小伙伴们有什么其他的思路呢?

本节课的案例源码已经上传,需要的小伙伴后台私信“5-23-X1”,希望大家多支持~~,多多关注 ~ ~

好了,明晚21:00,准时再见!


因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多