今天通过EXCEL365版本的新函数来分享一个实例的应用,如下图所示:

第一部分:数据规范化整理
根据上图1转化为下图2,A2:A4含有合并的单元格,即A2和A3合并为福建省,A4为四川省,B2:B4是城市,各个城市之间又有"/"斜杠隔开,而且福建省所对应的城市分别在两行中。根据以上的特点我们要对省份和城市转化为正常的单元格所对应的数。
首先对省份合并单元格进行填充为两个福建省和一个四川省,当然方法多样,但是下面分享利用SCAN这个函数来实现,这个函数它是可以遍历数据源的每一个数据,根据自定计算的方式,返回一个与数据源尺寸相等的数组,最主要的是这个函数可以建立当前元素与上一个元素之间的关联,特别适合于解决累加值、连续次数等问题。
SCAN函数的基本语法如下:
=SCAN(初始值,数据源,LAMBDA(参数1,参数2,计算方式))
回到示例图,如何通过SCAN函数来实现对省份的填充问题,A2:A4存在合并单元格,现在需要建立一个内存数组,将A2:A4的数据填充完整。
即参考公式如下:
=SCAN("",A2:A4,LAMBDA(x,y,IF(y="",x,y)))

第1个参数是初始值,第2个参数为数据源,第3个参数是一个LAMBDA表达式,它有3个参数,参数1和参数2分别被命名为x和y,其中x指向初始值,y指向数据源的迭代元素,第3个参数是一个计算方式,即if函数。
IF(y="",x,y) IF函数的意思是如果计算元素y为空时,则返回初始值x,否则返回y自身。即把每个元素遍历后,将计算结果以数组的形式返回,得到我们所需要的结果。
再次就是B2:B4单元格了,这个区域没有并合单元格,只要把这个数据转换为一个就得到了每个城市分别填充到一行中。这个也要用到新的函数,即TEXTJOIN和TEXTSPLIT这两对一合一分的绝配组合了。
TEXTJOIN函数的基本语法:
=TEXTJOIN(分隔符,忽略空白单元格,字符串1,...)
回到示例图,利用TEXTJOIN函数把B2:B4单元格内容合并,并用@符号对合并的行隔开,即结果如下:
即参考公式如下:
=TEXTJOIN("@",,B2:B4)

通过TEXTJOIN函数把数据合并后,再用TEXTSPLIT函数来把它他再拆开,这两对好基友,就是一个合一个拆。
TEXTSPLIT函数的基本语法:
=TEXTSPLIT(要拆分的文本,[行分隔符],[列分隔符],[是否忽略空格],[要填充的值])
回到利用TEXTJOIN函数把B2:B4单元格内容合并后的数据行,用TEXTSPLIT函数将它再次拆分,即结果如下:
即参考公式如下:
=TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@")

TEXTSPLIT函数以"/"和"@"按照行列分别进行拆分出各个城市。
经过以上这两步的操作,现在已经把不规则的数据整理出来形成可以进一步处理的有效数据。
第二部分:利用处理好的数据进行操作
数据处理规范后,但是还离我们所要的数据表即表2的结果还有距离,下面就把我们通过处理好的数据,进一步的应用就可以达到目的。
对TEXTSPLIT函数拆分出来的数据进行转化为一列数据,还是要用到新的函数TOCOL函数,把它转化为一列数据。
TOCOL函数的基本语法:
=TOCOL(区域,[忽略情况],[按行还是按列合并]) 忽略情况分别有四种:0-保留所有值(默认);1-忽略空白;2-忽略错误;3-忽略空白和错误。
回到示例图,利用TOCOL函数把TEXTSPLIT函数拆分出来的数据进行转化为一列数据。结果如下图:
即参考公式如下:
=TOCOL(TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@"),2)

而省份则要根据城市来对应返回省份,因此就要通过判断城市所在的行对应的省份,省份原先通过SCAN函数把城市对应的省份填充完善,即福建省对应的城市是两行。
现在需要通过城市返回对应的省份,还是要用到新的函数LET函数。
LET函数的基本语法:
=LET(变量名1,变量内容1,变量名2,变量内容2,……计算表达式) LET函数它是将计算结果分配给名称,可以通过定义名称来计算结果。它的参数都是成对出现的,最多可以设置126对,并且【变量内容】这个参数是可以支持函数的。LET函数的意思是先定义变量,把定义好的变量提供给后面的参数或计算调用。
回到示例图,利用LET函数把省份转化为一列。结果如下图:
即参考公式:
=LET(m,TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@"),s,SCAN("",A2:A4,LAMBDA(x,y,IF(y="",x,y))),TOCOL(IF(m&"">0,s),2))

定义了第1个变量名为m,变量内容是TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@"),定义了第2个变量名为s,变量内容是SCAN("",A2:A4,LAMBDA(x,y,IF(y="",x,y))),计算表达式是TOCOL(IF(m&"">0,s),2),返回了计算结果,就得到了省份与城市对应的值。LET函数后面的参数,可以调用前面定义的任意变量,如可以在计算里面用前面定义的变量,第二个参数可以用第一个定义的变量。
得到这两列数据后,要把它们横向堆叠成一个表格,就要用到HSTACK函数,这个函数也是excel365版本的新函数。
HSTACK函数的基本语法:
=HSTACK(参数,参数,参数……) 它的作用是把各个参数按顺序横向堆叠在一起。当合并的数组行数不一致时,返回结果的行数以各数组中最大行数为准,少于最大行数的数组可以理解成被扩充了缺少的行,但以#N/A填充。
回到示例图,利用HSTACK函数来把数据横向顺序堆叠成表格。结果如下图:
即参考公式:
=LET(m,TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@"),s,SCAN("",A2:A4,LAMBDA(x,y,IF(y="",x,y))),HSTACK(TOCOL(IF(m&"">0,s),2),TOCOL(m,2)))

LET函数的计算表达式是HSTACK(TOCOL(IF(m&"">0,s),2),TOCOL(m,2)),HSTACK函数是把TOCOL(IF(m&"">0,s),2)和TOCOL(m,2)的结果横向顺序推叠,得到两列数据。最后把价格列通过TOCOL(IF(m&"">0,C2:C4),2)来获取对应城市的数据,放到HSTACK函数的第3个参数,就实现了3列数据的表格,结果如下图:
参考公式:
=LET(m,TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@"),s,SCAN("",A2:A4,LAMBDA(x,y,IF(y="",x,y))),HSTACK(TOCOL(IF(m&"">0,s),2),TOCOL(m,2),TOCOL(IF(m&"">0,C2:C4),2)))

这个就完成了整个数据表格的转换操作。但是为了使表格完美,把省份、城市和价格字段也加进去,再用VSTACK函数来实现,即可。具体结果如下图所示:
VSTACK函数的基本语法:
=VSTACK(参数,参数,参数……) 它是把各个参数纵向堆叠在一起。VSTACK函数与HSTACK函数相同,只是把数据的堆叠方向相反。
即参考公式:
=LET(m,TEXTSPLIT(TEXTJOIN("@",,B2:B4),"/","@"),s,SCAN("",A2:A4,LAMBDA(x,y,IF(y="",x,y))),VSTACK({"目的省份","目的城市","价格"},HSTACK(TOCOL(IF(m&"">0,s),2),TOCOL(m,2),TOCOL(IF(m&"">0,C2:C4),2))))

这个例子,分别用到了excel365中的最新函数,LET、TEXTSPLIT、SCAN、LAMBDA、VSTACK、HSTACK、TOCOL函数,并简单的介绍了这些函数的基本语法。通过本例可以很直观的理解它们的应用场景,希望对亲门提供学习帮助。