数据拆分,哪个工具最好用:vba?pq?f(x)?

下图A1:D3是数据源,记录的是手机的信息。其中D列的每个单元格中有好多条数据。现在的要求是将D列单元格中的每条数据拆分为一条完整的记录,结果如下表所示。

现在为了方便展示,数据源只取2条数据,同时把结果区域和数据源放在同一工作表中。实际工作中,数据量比较大,应把结果区域放在另一个工作表中。
对于这种问题,power query无疑是操作起来最简单、最方便的工具,只需点几下鼠标即可搞定。但是公众号目前主要分享函数的用法,所以还是先来看下函数的解法吧。
-01-

函数法

想用函数解决这个问题,还是多用辅助列吧。多走几步也没关系,总比复杂的数组公式来得好。第一,复杂的数组公式很多新手朋友看不懂;第二,数据量大的话,用数组公式卡的你想砸电脑。

在E列添加辅助列,E2单元格输入公式=LEN(D2)-LEN(SUBSTITUTE(D2,CHAR(10),))+1,下拉填充,计算D列各单元格有几条数据,实际是用换行符char(10)的个数加1。
然后在F列添加辅助列,F2单元格输入公式=SUM(E$1:E1),下拉填充,计算D列单元格数据的累加数,这个累加数很关键。
这两步铺垫好后,就可以写公式了。在A8单元格输入下面的公式,右拉到C列,再下拉填充。D列是另外一个公式。

=IF(ROW(A1)>SUM($E$2:$E$3),"",LOOKUP(ROW(A1)-1,$F$2:$F$3,A$2:A$3))

公式中,lookup函数是主要部分,外层的if函数是用来条件判断的,当公式下拉的序号超过D列单元格中的总数据量时,显示为空。比如,现在D列单元格中的总数据量是6,所以只需拆分为6条记录就可以了。当公式下拉到第7条时,就让它显示为空。

LOOKUP(ROW(A1)-1,$F$2:$F$3,A$2:A$3)这部分通过记录数与累加数的关系,得到了拆分后的多条记录。实际就是按指定次数重复内容的一种方法。这部分需要你慢慢体会,不清楚的小伙伴可以搜索之前的文章。

在D8单元格输入下面的公式,下拉填充,完成。

=IF(A8="","",MID(CLEAN(LOOKUP(ROW(A1)-1,$F$2:$F$3,D$2:D$3)),(ROW(A1)-LOOKUP(ROW(A1)-1,F$2:F$3))*15-14,15))

LOOKUP(ROW(A1)-1,$F$2:$F$3,D$2:D$3)这部分是将D列单元格的内容重复多次,但还没有拆分。外面套个clean将中间的换行符清除掉。

ROW(A1)-LOOKUP(ROW(A1)-1,F$2:F$3)这部分为了得到展开的序号。这两部分的对应关系如下所示,最后用mid函数从左边的结果中,取出右边相应的第几条数据。


-02-

vba代码法

最近在学习vba,也从群里的小伙伴身上学了不少。所以就来分享下vba代码的方法,如有错误,请不吝指出。我将代码的结果放在sheet2中。
代码如下:
链接:

https://pan.baidu.com/s/1Ae0Y4iQIFbDnLtG3o42-hw

提取码:y7uz
(0)

相关推荐