表格折叠展开操作办法说明

最近遇到一个小需求,如何将Excel单元格中的内容拆分到多行?

下图中左边是原始数据,每位员工需要上班的日期,合并在一个单元格内,日期之间间隔一个空白符;现在需要拆分成表右边所示的样子,即将员工需要上班的日期拆分成一行行数据;

表格折叠展开操作办法说明

传统的方法可以直接对班期列进行分列操作,再将分列所得数据一行行复制转置粘贴,步骤繁琐麻烦,这里用VBA处理,写好代码,一秒钟搞定,一劳永逸~

话不多说,让我们看下处理效果:

表格折叠展开操作办法说明

思路

1、先看下数据,是否规律,有迹可循,可以发现班期列皆为日期之间加一个空白符,一个日期为8位数,长度为8;

2、计算每个单元格内日期的个数,这里利用【Int(Len(Sheets(“Sheet1”).Cells(i, 2)) / 9) + 1】先利用长度函数Len函数计算出单元格的长度;

再将其长度除以9(虽然每个日期的长度是8,但是日期后面皆跟了一个空白字符,所以除以9);

再利用int函数取整,最后结果需要加上1,因为最后一个日期后面没有空白符;

最终得出来的结果就是单元格内部包含的日期个数;如对B2单元格用此函数:INT(LEN(B2)/ 9) + 1=3,返回3;

3、依次循环从单元格内取出每一个日期,写入到Excel工作表中去,这里用MID函数;

4、在最外面嵌套一个大循环,依次对数据源班期列每一个单元格进行操作,依次取出所有的日期,写入Excel表格中,完成拆分。

代码

代码展示如下:

表格折叠展开操作办法说明

代码讲解:

1、新建一个新的插页,并重命名为【拆分】插页,用于存放拆分的数据,并将表头A1/B1单元格填入内容;

2、参数b主要是用来统计拆分插页目前数据一共有多少行,方便数据写入;

3、第一个for循环,循环插页Sheet1中班期列每个单元格;

4、参数a上面说过,为每个单元格内日期的个数;

5、再次利用一个for循环,依次取出日期,并将之写入到【拆分】插页中去;

这里的 Mid(Sheets(“Sheet1”).Cells(i, 2), (j – 1) * 9 + 1, 8)为取数函数,第一个参数:要取字符串的单元格,第二个参数:要取字符串开始的位置,第三个参数:要取字符串的长度;

6、通过两次循环,完成数据拆分。

便于大家复制,详细代码如下:

Sub 拆分单元格()Dim a%, b%, i%, j%Sheets.Add After:=ActiveSheetActiveSheet.Name = "拆分"Sheets("拆分").Cells(1, 1) = "员工ID"Sheets("拆分").Cells(1, 2) = "班期"b = Sheets("拆分").Cells(Rows.Count, 1).End(xlUp).RowFor i = 2 To Sheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Rowa = Int(Len(Sheets("Sheet1").Cells(i, 2)) / 9) + 1For j = 1 To ab = b + 1Sheets("拆分").Cells(b, 1) = Sheets("Sheet1").Cells(i, 1)Sheets("拆分").Cells(b, 2) = Mid(Sheets("Sheet1").Cells(i, 2), (j - 1) * 9 + 1, 8)NextNextMsgBox "已完成"End Sub

小结

对于有规律的、经常需要操作的数据,最好利用VBA技术,一次编写,受益终身,摆脱繁琐的操作,本例中仅通过日期数据为大家做个展示,至于其它类型的数据拆分,只需要理清逻辑,对函数参数、代码做相应的修改即可。

纸上得来终觉浅,绝知此事要躬行,小伙伴们记得动手操作下,有问题,欢迎留言交流!

  • 114 views
    A+
发布日期:2021年09月01日 10:00:00  所属分类:知识经验
标签: