函数实现二维表转一维表、自定义函数LAMBDA()

yumo6661周前 (09-12)技术文章13

一、函数实现二维表转一维表

通过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所示。

相关文章

cython如何调用C语言的函数?_c 中如何调用python

在 Cython 中调用 C 语言函数主要通过以下几种方式实现:1. 使用 cdef extern 声明外部 C 函数基本语法cdef extern from "头文件.h":返回类型...

C/C++函数调用的奥秘_c++函数调用原理

在C/C++编程的世界里,函数调用是程序运行的核心机制之一。然而,许多程序员在日常开发中,往往只关注代码的逻辑,而忽略了函数调用背后的底层细节。今天,就让我们一起深入探索C/C++函数调用的全过程,从...

C++成员函数如何工作?this指针、name mangling 成员函数指针解析

0.引言 在C++面向对象编程中,成员函数是对象行为的核心载体。我们每天都在使用成员函数,但却很少深入思考其底层的实现机制:为什么成员函数可以直接访问成员变量?编译器如何区分不同类的同名函数?静态成员...

C语言入门:学生成绩管理程序的完善(1):用文件保存数据

这是C语言入门的第27篇文章。今天讲学生成绩管理程序的完善:怎样利用文件来保存数据。还是昨天的问题:我怎么知道一个文件的内容是什么?我怎么知道比如一行有多少个数,多少个数以后是换行?这是因为文件是我们...

C语言应用笔记:常用的printf打印输出不同类型数据

我叫程序员阿虾, 在终端前摸过太多凌晨, 熟悉printf这一行字带来的安心与危险。今天想跟你聊聊我踩过的坑, 和一些别人不常说的细节, 用第一人称把经验交给你, 有点唠叨, 希望你少走弯路。为什么要...

C语言应用笔记:简单的最大最小值比较

使用宏定义实现泛型比较函数,用于求取两个值的最大值和最小值。核心宏定义解析#define MAX(x, y) ((x) > (y) ? (x) : (y)) // 返回两个值中较大的一个 #de...