前景提要
好了今天我们来继续玩一下工作表的拆分,之前我们已经尝试了用指定列,指定行的方式来进行工作表的拆分,不知道有没有点燃小伙伴们的拆分热潮呢?之前我在写按照工作表的指定行数进行拆分的时候,就想到一个问题,要是行数不确定,只能按照某个单元格的内存为参照物,如何进行拆分呢?我平时在进行工作表的拆分的时候,时不时也会碰到这样的问题,一般是在月总结的时候会碰到,不知道大家有没有这样的需求,我先分享出来
场景说明
场景说明
![b5b99d72d8e8289dbb8ba24dd7f09ef9.png](https://img-blog.csdnimg.cn/img_convert/b5b99d72d8e8289dbb8ba24dd7f09ef9.png)
这里我们将之前的案例稍微修改一下,更换下场景,这次我们这里放置的是某个班级所有学生历次的考试成绩,不过因为汇总的时候为了方便都是不断的往下新增数据的,并且为了打字方便,姓名都是直接复制的,结果要进行分析的时候,发现这样很难看出来每个学生的成绩变化情况,所以现在我们需要针对总表进行拆分,我们已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
来看看代码执行的过程
这已经是套路了。不解释了
![e62fbaa7b19283734f1c36c885d5b028.png](https://img-blog.csdnimg.cn/img_convert/e62fbaa7b19283734f1c36c885d5b028.png)
输入我们想要的的参照物
![1742848b185239fa9739ee21eaf450ef.png](https://img-blog.csdnimg.cn/img_convert/1742848b185239fa9739ee21eaf450ef.png)
然后静候佳音
![56833dd30ee862598dc9d123d00582ee.png](https://img-blog.csdnimg.cn/img_convert/56833dd30ee862598dc9d123d00582ee.png)
为了检查方便,我们抽取最后一次的数据来看看
![b42b0b203a95eee68d4b7de46271f4a6.png](https://img-blog.csdnimg.cn/img_convert/b42b0b203a95eee68d4b7de46271f4a6.png)
代码分析
来看看今天的代码解析
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,这里注意这个关键点。
![a28286b9aa91045951e3f151b3dac4b6.png](https://img-blog.csdnimg.cn/img_convert/a28286b9aa91045951e3f151b3dac4b6.png)
然后进入第一个小循环,不断的往下走,当找到A1的位置之后,我们就有了数据区域,数据区域在哪里呢?
![06bbc5bf95c16ecbf3c1c174e0c05cd7.png](https://img-blog.csdnimg.cn/img_convert/06bbc5bf95c16ecbf3c1c174e0c05cd7.png)
Range(a, Cells(i - 1, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)
结合代码来一起看看,找到A1的位置之后,A1的行数正好就是i的值,但是我们的数据区域不含新的这个A1
所以i-1才是上面的数据的区域的行数,这样答应大家应该能够理解了,后面的获取列数的位置,前面已经说过很多次了,这里容许我稍微偷懒下,略过
然后后面就是循环了,来进入最后一个难点,
就是最后一行的判断,到了最后一行之后,肯定不会再往下循环了,所以也不会在找到一个A1了
![6fb4e0ad1564d1f510c6864d853ee853.png](https://img-blog.csdnimg.cn/img_convert/6fb4e0ad1564d1f510c6864d853ee853.png)
这个时候我们既要判断了,如果i=L,,就是总行数的时候,我们就直接将a和最后一行之间的区域放在最后一个工作表中,因为不存在另外一个A1了,所以这里我们要判断是否得到最后一行
![a393f43963bea5474062ff2745d414b2.png](https://img-blog.csdnimg.cn/img_convert/a393f43963bea5474062ff2745d414b2.png)
这样一来下面代码中的不同,大家就应该能够理解了。