分享

Excel VBA 7.55按照数据区域拆分工作表,报表拆分玩出新花样

 Excel和VBA 2021-04-11

一起学习,一起进步~~

今天我们继续来分享工作表拆分的操作,相对于昨天来说,我们那今天的这个场景可能会比较常见一些,因为此类问题有几个小伙伴一起提出过类似的情况,所以今天我也是专门合并在一起来实现下,今天的这个拆分场景想比较昨天的案例,有时一个升级版,不仅仅有空行,还有空列,数据都是独立成块,我们要一块块一片片的进行拆分,来看看案例

场景说明

今天的数据是这样的,这里肯定会有小伙伴们抱怨了,这个数据完全看不清内容,其实今天数据源的内容反而不是主要的,主要是数据的格式,大致一眼看过去,就能够看到数据都是被分成一块一块的,一个区域一个数据源,这样的数据构造影像中是比较常见,有很多时候我们为了一次性展示数据,通常会选择这样的方式来实现,但是数据分析和保存的时候,谁都不喜欢看这样的数据,那么这样的数据如何进行拆分呢?

代码区

来看看代码吧

Sub swws()Dim sth As Worksheet, sthn As WorksheetSet sth = ActiveSheetRowl = sth.UsedRange.Rows.CountColl = sth.UsedRange.Columns.CountFor i = 1 To Rowl For j = 1 To Coll If Cells(i, j) <> "" Then Rcount = Cells(i, j).CurrentRegion.Rows.Count Ccount = Cells(i, j).CurrentRegion.Columns.Count Worksheets.Add after:=Worksheets(Worksheets.Count) Set sthn = ActiveSheet sth.Cells(i, j).CurrentRegion.Copy sthn.Cells(1, 1) sth.Activate j = j + Ccount - 1 End If Next j i = i + Rcount - 1Next iEnd Sub

简短了很多,来看看过程

额、、、什么都不用选择,按照当前的场景,直接执行程序就可以进行拆分了,我们来看看结果

刚好8个板块的数据被拆成了8个区域,满足了我们的要求,今天的代码就比较的简单了,因为数据模式比较的规则,来看看代码的分析

代码分析

今天的代码的重点就不在代码本身,而在代码逻辑本身的思路上面

Rowl = sth.UsedRange.Rows.CountColl = sth.UsedRange.Columns.Count

我们这里先得到当前区域的总行数和总列数,usedrange代表的是所有的使用区域,无视空行空列

有了总行数和总列数之后,我们就可以开始构造循环了,这里的循环和我们之前的循环又有一点线不同了,这里是两个循环同时进行

For i = 1 To Rowl For j = 1 To Coll **** Next jNext i

i代表的是行数,j代表的则是列数,再循环行的时候,同时循环列

我们先看第一次循环

If Cells(i, j) <> "" Then Rcount = Cells(i, j).CurrentRegion.Rows.Count Ccount = Cells(i, j).CurrentRegion.Columns.Count Worksheets.Add after:=Worksheets(Worksheets.Count) Set sthn = ActiveSheet sth.Cells(i, j).CurrentRegion.Copy sthn.Cells(1, 1) sth.Activate j = j + Ccount - 1 End If

cells(1,1)不为空,是数值的,所以这里既可以进入判断内部了,得到当前这个这个小的区域的范围,如何得到

CurrentRegion

就是这一小块区域,已空行空列为标准,非空的填充数据的都是CurrentRegion的范围,然后我们可以得到这个单位的总行数总列数了,有了范围,直接将他们丢到新的工作表中就可以了。这里就很简单了。 

然后我们继续,这个时候要注意循环的过程,这里时候我们正在进行j就是列的循环,这个时候我们的列数j是1

我们再次循环是从2开始吗?

但是第2列已经是我们第一个数据区的范围了,刚刚已经复制过去了

如果你想到这一点了,那就证明你已经理解CurrentRegion的范围了,既然已经复制过了,我们自然不能再次复制了,那么怎么办,直接跳跃

之前我们也用过跳跃式循环,j = j + Ccount - 1

当我们复制完一个区域之后,顺带的将j的数值变成我们刚刚复制的区域的总行数

然后再次循环,j就来到了空列,然后进入判断,cells(i,j)是否为空,为空,跳过j+1,就这样成功的进入了下一个数据区

这样又来到了下一个循环了,这个循环和上面的循环过程值一样的,不过这个已经到了j的结尾了,所以就会自动跳出j的循环了。

然后又回到i的循环,i在前民的两个循环中一直都是1.所以这里他也要选择和j一样的操作,我们不需要再循环之前已经复制的数据区了,直接让他跳跃式前进。

i = i + Rcount - 1


所以本节的代码是很简单,关键的重点是大家要理解这个代码工作的思路和逻辑,以及各个变量的作用和跳跃范围。

============================

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

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


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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多