前景提要

好了今天我们来继续玩一下工作表的拆分,之前我们已经尝试了用指定列,指定行的方式来进行工作表的拆分,不知道有没有点燃小伙伴们的拆分热潮呢?之前我在写按照工作表的指定行数进行拆分的时候,就想到一个问题,要是行数不确定,只能按照某个单元格的内存为参照物,如何进行拆分呢?我平时在进行工作表的拆分的时候,时不时也会碰到这样的问题,一般是在月总结的时候会碰到,不知道大家有没有这样的需求,我先分享出来

场景说明

场景说明

这里我们将之前的案例稍微修改一下,更换下场景,这次我们这里放置的是某个班级所有学生历次的考试成绩,不过因为汇总的时候为了方便都是不断的往下新增数据的,并且为了打字方便,姓名都是直接复制的,结果要进行分析的时候,发现这样很难看出来每个学生的成绩变化情况,所以现在我们需要针对总表进行拆分,我们已A1即第一个学生的名字为参照物进行拆分,我们来看看如何实现

代码区

Sub chai()
Dim rng As Range, sth As Worksheet, sthn As Worksheet, pathn$, str$, a As Range
pathn = ActiveWorkbook.Path
Set sth = ActiveSheet
Set rng = Application.InputBox("请选择表头区域", "表头区域的确定", , , , , , 8)
TitleR = rng.Rows.Count
TitleC = rng.Column
TitleColNum = rng.Columns.Count
str = InputBox("请输入参照内容")
l = ActiveSheet.Cells(Rows.Count, TitleR).End(xlUp).Row
CountR = l - TitleR
Set a = Cells(TitleR + 1, TitleC)
For i = TitleR + 2 To l
If Cells(i, TitleC) = str Or i = l Then
k = k + 1
Worksheets.Add after:=Worksheets(Worksheets.Count)
Set sthn = ActiveSheet
rng.Copy sthn.Cells(1, 1)
sth.Activate
If i <> l Then
Range(a, Cells(i - 1, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)
Else
Range(a, Cells(i, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)
End If
sthn.Name = "第" & k & "次拆分"
Set a = Cells(i, TitleC)
End If
Next i
End Sub

来看看代码执行的过程

这已经是套路了。不解释了

输入我们想要的的参照物

然后静候佳音

为了检查方便,我们抽取最后一次的数据来看看

代码分析

来看看今天的代码解析

Set rng = Application.InputBox("请选择表头区域", "表头区域的确定", , , , , , 8)
TitleR = rng.Rows.Count
TitleC = rng.Column
TitleColNum = rng.Columns.Count

常规套路操作,表头数据不规则,我们肯定要获得表头的区域的

str = InputBox("请输入参照内容")

这里就是我们要获得输入的参照物的内容,今天就简单一点,使用inputbox函数来直接实现,相对于inputbox方法,函数的写法要简单多,但是如果有输入内容限制的话,最好还是使用inputbox方法

然后进入我们的循环体

在进入循环之前,我们要先做一件事情

Set a = Cells(TitleR + 1, TitleC)

这一步非常的重要,在我们整个循环体中,a的作用也是非常的大的,他代表的就是我们的参照物A1所在的单元格位置,是不断变化的,但是不管怎变,这个变数所代表的的意义是不变的。

来开始进入循环

我们的循环从A2开始,而不是A1,这里注意这个关键点。

然后进入第一个小循环,不断的往下走,当找到A1的位置之后,我们就有了数据区域,数据区域在哪里呢?


Range(a, Cells(i - 1, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)

结合代码来一起看看,找到A1的位置之后,A1的行数正好就是i的值,但是我们的数据区域不含新的这个A1

所以i-1才是上面的数据的区域的行数,这样答应大家应该能够理解了,后面的获取列数的位置,前面已经说过很多次了,这里容许我稍微偷懒下,略过

然后后面就是循环了,来进入最后一个难点,

就是最后一行的判断,到了最后一行之后,肯定不会再往下循环了,所以也不会在找到一个A1了

这个时候我们既要判断了,如果i=L,,就是总行数的时候,我们就直接将a和最后一行之间的区域放在最后一个工作表中,因为不存在另外一个A1了,所以这里我们要判断是否得到最后一行

这样一来下面代码中的不同,大家就应该能够理解了。


推荐阅读:
相关文章