前景提要
好了今天我们来继续玩一下工作表的拆分,之前我们已经尝试了用指定列,指定行的方式来进行工作表的拆分,不知道有没有点燃小伙伴们的拆分热潮呢?之前我在写按照工作表的指定行数进行拆分的时候,就想到一个问题,要是行数不确定,只能按照某个单元格的内存为参照物,如何进行拆分呢?我平时在进行工作表的拆分的时候,时不时也会碰到这样的问题,一般是在月总结的时候会碰到,不知道大家有没有这样的需求,我先分享出来
场景说明
场景说明
这里我们将之前的案例稍微修改一下,更换下场景,这次我们这里放置的是某个班级所有学生历次的考试成绩,不过因为汇总的时候为了方便都是不断的往下新增数据的,并且为了打字方便,姓名都是直接复制的,结果要进行分析的时候,发现这样很难看出来每个学生的成绩变化情况,所以现在我们需要针对总表进行拆分,我们已A1即第一个学生的名字为参照物进行拆分,我们来看看如何实现
代码区
Sub chai()Dim rng As Range, sth As Worksheet, sthn As Worksheet, pathn$, str$, a As Rangepathn = ActiveWorkbook.PathSet sth = ActiveSheetSet rng = Application.InputBox("请选择表头区域", "表头区域的确定", , , , , , 8)TitleR = rng.Rows.CountTitleC = rng.ColumnTitleColNum = rng.Columns.Countstr = InputBox("请输入参照内容")l = ActiveSheet.Cells(Rows.Count, TitleR).End(xlUp).RowCountR = l - TitleRSet a = Cells(TitleR + 1, TitleC)For i = TitleR + 2 To lIf Cells(i, TitleC) = str Or i = l Thenk = k + 1Worksheets.Add after:=Worksheets(Worksheets.Count)Set sthn = ActiveSheetrng.Copy sthn.Cells(1, 1)sth.ActivateIf i <> l ThenRange(a, Cells(i - 1, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)ElseRange(a, Cells(i, TitleColNum + TitleR - 1)).Copy sthn.Cells(TitleR + 1, 1)End Ifsthn.Name = "第" & k & "次拆分"Set a = Cells(i, TitleC)End IfNext iEnd Sub
来看看代码执行的过程
这已经是套路了。不解释了
输入我们想要的的参照物
然后静候佳音
为了检查方便,我们抽取最后一次的数据来看看
代码分析
来看看今天的代码解析
Set rng = Application.InputBox("请选择表头区域", "表头区域的确定", , , , , , 8)TitleR = rng.Rows.CountTitleC = rng.ColumnTitleColNum = 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了,所以这里我们要判断是否得到最后一行
这样一来下面代码中的不同,大家就应该能够理解了。