请求拆解MAKEARRAY+LAMBDA组合Excel公式,以扩展属性
公式逐段拆解说明
核心框架:MAKEARRAY 生成动态结果数组
=MAKEARRAY(COUNTA(B2:B),COUNTA(D1:O1),LAMBDA(r,c,...))
COUNTA(B2:B):结果的总行数,等于B列第2行及以下非空单元格的数量COUNTA(D1:O1):结果的总列数,等于第1行D到O列非空表头的数量LAMBDA(r,c,...):对结果数组的每一行r、每一列c执行后续逻辑计算
最终判断:匹配表头返回结果
IF(REGEXMATCH(..., "(?i)"&INDEX(D1:O1,,c)),1,)
INDEX(D1:O1,,c):获取当前列c对应的表头文本"(?i)":开启正则匹配的不区分大小写模式REGEXMATCH(...):检查前面生成的标识字符串是否包含当前表头内容- 匹配成功返回
1,失败则返回空值
核心生成逻辑:嵌套LAMBDA生成匹配标识串
这部分是公式的核心,用来根据B、C列的内容生成用于匹配的标识字符串:
LAMBDA(ax,bx,IFS(...))(REGEXEXTRACT(INDEX(B2:B,r),"([^\s]*?) Subscription"), IFNA(...))
1. 传递给LAMBDA的两个参数
参数ax:提取订阅类型
REGEXEXTRACT(INDEX(B2:B,r),"([^\s]*?) Subscription")
从B列第r行文本中,提取Subscription前面的第一个单词(例如“Mixed Subscription”会提取出Mixed)
参数bx:提取对应重量数值
IFNA(SWITCH(REGEXEXTRACT(INDEX(C2:C,r),"Small|Medium|Large"),"Small",250,"Medium",450,"Large",900), SWITCH(REGEXEXTRACT(INDEX(B2:B,r),"Medium|Large"),"Medium",225,"Large",450))
- 优先从C列第
r行提取“Small/Medium/Large”,转换为对应数值:Small→250,Medium→450,Large→900 - 若C列提取不到目标关键词,就从B列第
r行提取“Medium/Large”,转换为数值:Medium→225,Large→450
2. IFS多条件生成匹配串
根据ax(订阅类型)和C列文本内容,生成不同格式的标识字符串:
IFS( REGEXMATCH(ax,"Mixed")*REGEXMATCH(INDEX(C2:C,r),"Blend")*REGEXMATCH(INDEX(C2:C,r),"Filter"),"BLEND-"&bx&"|FILTER-"&bx, REGEXMATCH(ax,"Mixed")*NOT(REGEXMATCH(INDEX(C2:C,r),"Blend"))*REGEXMATCH(INDEX(C2:C,r),"Filter"),"ESP-"&bx&"|FILTER-"&bx, REGEXMATCH(ax,"Mixed")*NOT(REGEXMATCH(INDEX(C2:C,r),"Filter")),"BLEND-"&bx&"|ESP-"&bx, LEN(ax),SUBSTITUTE(ax&"-"&bx,"Espresso","ESP") )
- 第1条:订阅类型为Mixed,且C列同时包含Blend和Filter → 生成
BLEND-数值|FILTER-数值 - 第2条:订阅类型为Mixed,C列不含Blend但含Filter → 生成
ESP-数值|FILTER-数值 - 第3条:订阅类型为Mixed,C列不含Filter → 生成
BLEND-数值|ESP-数值 - 第4条:其他订阅类型(ax非空)→ 生成
订阅类型-数值,并将“Espresso”替换为“ESP”(例如“Espresso-450”转为“ESP-450”)
整体逻辑梳理
- 根据B列数据行数和D-O列表头数量,创建空的动态数组
- 对数组每个单元格(r,c),先基于第r行的B、C列内容生成匹配标识串
- 检查标识串是否包含第c列的表头文本(不区分大小写),包含则填1,否则留空
内容的提问来源于stack exchange,提问作者Michael Tyson
相关产品推荐
相关产品推荐

