函数实现二维表转一维表、自定义函数LAMBDA()
一、函数实现二维表转一维表
通过EXCEL函数实现二维表转一维表的最终效果,如图1所示。
步骤1:列标题与行标题 & 处理
为了便于后面行列标题进行拆分,列标题&行标题之间加上”-”,
公式:=A5:A9&"-"&B4:E4,得到五行四列数组,如下图2所示。
步骤2:TEXTJOIN处理
TEXTJOIN语法
TEXTJOIN(delimiter, ignore_empty, text1, [text2, ...])
· delimiter:必需参数,指的是用于连接文本项的分隔符。它可以是字符串,像逗号(,)、空格()等。
· ignore_empty:必需参数,是一个逻辑值。若为 TRUE,则会忽略空单元格;若为 FALSE,则会将空单元格当作空文本处理。
· text1:必需参数,是要连接的第一个文本项,可以是文本、数字、单元格引用或者区域引用。
· [text2, ...]:可选参数,是要连接的其他文本项,最多能有 252 个额外的文本项。
将步骤1得到的五行四列数组进行文本连接处理,连接符选逗号“,”
函数公式:=TEXTJOIN(",",,A5:A9&"-"&B4:E4),得到一行数组,如下图3所示。
步骤3:TEXTSPLIT处理
TEXTSPLIT语法
TEXTSPLIT(text, col_delimiter, [row_delimiter], [ignore_empty], [match_mode], [pad_with])
1. text:这是必需参数,代表要拆分的文本字符串或者包含该字符串的单元格引用。
2. col_delimiter:也是必需参数,它指的是用于指定列分隔的字符或字符串。比如,若要按逗号拆分文本,就把这个参数设置为逗号(,)。
3. [row_delimiter]:此为可选参数,用于指定行分隔的字符或字符串。若要按换行符拆分文本,就可以使用换行符作为行分隔符。
4. [ignore_empty]:同样是可选参数,为逻辑值。当设置为 TRUE 时,会忽略拆分后产生的空文本;设置为 FALSE 时,则保留空文本。默认值为 TRUE。
5. [match_mode]:可选参数,是一个数值,用于指定匹配模式。其取值如下:
1. 0 表示精确匹配(默认值)。
2. 1 表示通配符匹配。
3. -1 表示区分大小写的精确匹配。
6. [pad_with]:可选参数,用于指定在结果数组大小不一致时填充的文本,默认值为空文本。
将步骤2得到的一行数组进行拆分,列拆分按“-”,行拆分按“,”,
函数公式:=TEXTSPLIT(TEXTJOIN(",",,A5:A9&"-"&B4:E4),"-",","),得到两列数组,如下图4所示
步骤4:TOCOL处理
TOCOL语法
TOCOL(array, [ignore], [scan_by_row])
· array:必需参数,要转换为单列的数组、区域或单元格引用。例如A1:C3或{"a","b","c";"d","e","f"}。
· [ignore]:可选参数,决定是否忽略特定类型的数据,具体取值如下:
· 0 或 FALSE:不忽略任何值,将数组中的所有元素包含在结果中。
· 1 或 TRUE:忽略空单元格。
· 2:忽略错误值。
· 3:同时忽略空单元格和错误值。默认值为0。
· [scan_by_row]:可选参数,确定扫描数据的方向,取值如下:
· 0 或 FALSE:按列扫描(默认值),先从上到下扫描第一列,再依次扫描后续列。
· 1 或 TRUE:按行扫描,先从左到右扫描第一行,再依次扫描后续行。
将数据区域B5:E9的数据转换为一列数组,放步骤3生成的数组后面。
函数公式:=TOCOL(B5:E9),得到二个数组区域,如下图5所示。
步骤5:HSTACK处理
HSTACK 函数是用于水平合并数组或区域的动态数组函数,该函数能把多个数组或区域按水平方向拼接成一个新的数组。以下为你详细介绍其语法、参数及使用示例。
HSTACK语法
HSTACK(array1, [array2, ...])
· array1:此为必需参数,代表第一个要进行水平合并的数组、区域或者单元格引用。例如,它可以是一个单元格区域(如 A1:C3),也可以是数组常量(像 {1, 2, 3; 4, 5, 6})。
· [array2, ...]:这是可选参数,代表后续要进行水平合并的数组、区域或者单元格引用。你最多可以指定 255 个数组或区域。
将步骤4得到的二组数组区域,横向拼接成一个新的数组。
函数公式:=HSTACK(TEXTSPLIT(TEXTJOIN(",",,A5:A9&"-"&B4:E4),"-",","),TOCOL(B5:E9)),即可得到最终的一维表数据,如下图6所示。
二、自定义函数
将上面长串的嵌套函数打包成一个函数,后面再有二维转一维需求时,可直接调用打包的函数即可,实现步骤如下:
1、使用函数:LAMBDA()
二维表转一维表涉及列标题、行标题和数据区域,那么LAMBDA函数()内先定义列标题、行标题、数据区域,如下图8所示。
然后将A5:A9改为列标题,B4:E4改为行标题,B5:E9改为数据区域,如下图9所示。
我们可以通过在定义的函数后面加上(A5:A9,B4:E4,B5:E9)即可测试定义函数测试结果,自定义公式:
=LAMBDA(列标题,行标题,数据区域,HSTACK(TEXTSPLIT(TEXTJOIN(",",,列标题&"-"&行标题),"-",","),TOCOL(数据区域)))(A5:A9,B4:E4,B5:E9) ,如下图10所示。
我们可以通过“名称管理器”功能,为自定义函数公式LAMBDA(列标题,行标题,数据区域,HSTACK(TEXTSPLIT(TEXTJOIN(",",,列标题&"-"&行标题),"-",","),TOCOL(数据区域))) 起一个名字叫:二维转一维,如下图11所示。
下面用自定义的二维转一维函数测试,函数括号内分别为列标题、行标题和数据区域。
函数公式:=二维转一维(A5:A9,B4:E4,B5:E9),即可实现二维转一维的需求,而且操作起得方便快捷,如下图12所示。