PMC表格模型30:单行分拆多行多列模型
优秀创作者
全文约1300字
大家好,我是古老师,专注于PMC(生产计划与控制)领域的教学。今天我们要介绍的是PMC系列中的第30个表格模型——单行分拆为多行多列模型。
在处理表格时,我们有时会遇到一个单元格内同时包含文本、字母和数字的情况。特别是当这些信息代表一些特定的数据,比如子件信息及其对应的用量,并需要被拆分成多行多列时,我们应该如何操作呢?
例如,在下面的表格中:
A2单元格是父件产品“A”。
B2单元格包含了子件信息“C2050x3;M3080x2;S1005x1”。
这里,“x”用于连接子件编码和其对应的用量,“;”则用于区分不同的子件。面对这种情况,我们需要快速将这样的单一单元格内容拆分为多行多列格式。
分拆数据
正如前面所提到的,对于这种有规律的分行和分列操作,只需使用文本函数TEXTSPLIT即可。此函数可以根据特定的规则将数据拆分为多行或多列。
在合适的单元格位置输入动态数组函数如下:
=TEXTSPLIT(B2,"x",";")
函数解释:
第一个参数 "x" 指定了用于分割子件编码及其对应用量的分隔符(按列)。
第二个参数 ";" 指定了用于区分不同子件信息的分隔符(按行)。
这样,通过使用 TEXTSPLIT 函数,可以轻松地将原本位于单个单元格中的复合信息按设定规则拆分成多个单元格的数据,从而便于后续的数据处理与分析。
拼接数据
为了确保拆分后的子件信息仍能与对应的父件信息关联起来,我们可以使用拼接函数HSTACK 并结合错误屏蔽函数 IFERROR 来实现数组区域的拼接。在合适的位置输入动态数组公式如下:
=IFERROR(HSTACK(A2,TEXTSPLIT(B2,"x",";")),A2)
函数解释:
HSTACK 函数用于将多个数组或值按水平方向堆叠在一起。在这个例子中,它将父件信息(位于 A2 单元格)与通过 TEXTSPLIT 函数从 B2 单元格拆分得到的子件信息数组横向拼接起来。
TEXTSPLIT(B2, "x", ";") 部分负责根据指定的分隔符 "x" 和 ";" 将 B2 单元格中的文本拆分成多行或多列。
IFERROR 函数用于捕获并处理任何可能出现的错误,确保当 HSTACK 或 TEXTSPLIT 函数发生错误时,至少返回 A2 单元格的值,避免显示错误信息。
通过这种方式,可以确保每个子件信息都与其对应的父件信息正确匹配,并且即使在拆分过程中出现错误,也能保证数据的完整性和可读性。
堆叠数据
最后一步是模型的核心,即一键自动转换。为了实现这一点,我们可以使用REDUCE 函数配合 LAMBDA 来处理动态数组,并在固化前利用 OFFSET 函数将引用位置同步为单一引用单元格。在合适的位置输入以下动态数组公式:
=DROP(REDUCE("",TRIMRANGE(A2:A100),LAMBDA(X,Y,VSTACK(X,LET(A,Y,IFNA(HSTACK(A,TEXTSPLIT(OFFSET(A,,1),"x",";")),A))))),1)
函数解释:
函数解释:
REDUCE 函数用于遍历一个数组(或范围),并累积结果。在这个例子中,它从一个空字符串 "" 开始,遍历 TRIM(A2:A100) 范围内的每一行。
TRIM(A2:A100) 用于去除每个单元格中的多余空格,确保数据干净。
LAMBDA(X, Y, ...) 定义了一个匿名函数,其中 X 是累积的结果,而 Y 是当前遍历到的元素。
VSTACK(X, ...) 将新的计算结果垂直堆叠到累积结果 X 上。
LET(A, Y, ...) 定义了一个局部变量 A,其值为当前遍历到的父件信息 Y。
IFNA(HSTACK(A, TEXTSPLIT(OFFSET(A, 0, 1), "x", ";")), A) 部分尝试将父件信息 A 和通过 TEXTSPLIT 函数拆分得到的子件信息进行横向拼接。如果出现错误,则返回原始父件信息 A。
OFFSET(A, 0, 1) 获取与父件信息对应的子件信息所在的单元格。
最外层的DROP(..., 1) 用于移除累积结果中的第一行,因为初始值是一个空字符串,这会导致最终结果中多出一行空白。
通过这种方式,可以实现对一系列父件和子件信息的一键自动转换,并确保所有信息都能正确匹配和显示。