最近遇到一个小需求,如何将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:=ActiveSheet
ActiveSheet.Name = "拆分"
Sheets("拆分").Cells(1, 1) = "员工ID"
Sheets("拆分").Cells(1, 2) = "班期"
b = Sheets("拆分").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To Sheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Row
a = Int(Len(Sheets("Sheet1").Cells(i, 2)) / 9) + 1
For j = 1 To a
b = b + 1
Sheets("拆分").Cells(b, 1) = Sheets("Sheet1").Cells(i, 1)
Sheets("拆分").Cells(b, 2) = Mid(Sheets("Sheet1").Cells(i, 2), (j - 1) * 9 + 1, 8)
Next
Next
MsgBox "已完成"
End Sub
小结
对于有规律的、经常需要操作的数据,最好利用VBA技术,一次编写,受益终身,摆脱繁琐的操作,本例中仅通过日期数据为大家做个展示,至于其它类型的数据拆分,只需要理清逻辑,对函数参数、代码做相应的修改即可。
纸上得来终觉浅,绝知此事要躬行,小伙伴们记得动手操作下,有问题,欢迎留言交流!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。