如何修改公式以同时生成行列数据的所有组合?
修改公式同时生成跨列组合与行内/单列组合
针对你的需求,以下提供几种不同场景的修改方案,你可以根据实际需要选择:
原公式作用回顾
你当前的公式通过笛卡尔积生成了B、C、D列非空值的跨列组合(例如 B2 C3 D4 这类来自不同列的单个值组合)。
方案1:新增「单列所有非空值的完整串联」
如果需要加入的是每个列所有行值的完整组合(例如 B2 B3 B4、C2 C3 C4、D2 D3 D4),使用以下公式:
=INDEX(FLATTEN({ // 保留原有跨列笛卡尔积组合 FLATTEN(FLATTEN(FILTER(B2:B,B2:B<>"")&" "&TRANSPOSE(FILTER(C2:C,C2:C<>"")))&" "&TRANSPOSE(FILTER(D2:D,D2:D<>""))), // 新增单列所有行值的完整串联 TEXTJOIN(" ",TRUE,FILTER(B2:B,B2:B<>"")), TEXTJOIN(" ",TRUE,FILTER(C2:C,C2:C<>"")), TEXTJOIN(" ",TRUE,FILTER(D2:D,D2:D<>"")) }))
方案2:新增「单列内所有非空值的子集组合」
如果需要加入的是每个列内部所有可能的行值子集组合(例如B列的 B2、B3、B2 B3、B2 B3 B4 等所有子集),使用以下公式:
=INDEX(FLATTEN({ // 保留原有跨列笛卡尔积组合 FLATTEN(FLATTEN(FILTER(B2:B,B2:B<>"")&" "&TRANSPOSE(FILTER(C2:C,C2:C<>"")))&" "&TRANSPOSE(FILTER(D2:D,D2:D<>""))), // 生成B列所有子集组合 BYROW(SEQUENCE(2^COUNTA(FILTER(B2:B,B2:B<>""))-1),LAMBDA(x,TEXTJOIN(" ",TRUE,FILTER(FILTER(B2:B,B2:B<>""),BITAND(SEQUENCE(COUNTA(FILTER(B2:B,B2:B<>""))),x)>0)))), // 生成C列所有子集组合 BYROW(SEQUENCE(2^COUNTA(FILTER(C2:C,C2:C<>""))-1),LAMBDA(x,TEXTJOIN(" ",TRUE,FILTER(FILTER(C2:C,C2:C<>""),BITAND(SEQUENCE(COUNTA(FILTER(C2:C,C2:C<>""))),x)>0)))), // 生成D列所有子集组合 BYROW(SEQUENCE(2^COUNTA(FILTER(D2:D,D2:D<>""))-1),LAMBDA(x,TEXTJOIN(" ",TRUE,FILTER(FILTER(D2:D,D2:D<>""),BITAND(SEQUENCE(COUNTA(FILTER(D2:D,D2:D<>""))),x)>0)))) }))
方案3:新增「同行的列值组合」
注:原公式的笛卡尔积已经包含这类组合(例如 B2 C2 D2),但如果需要单独提取或确保同行组合被完整列出,使用以下公式:
=INDEX(FLATTEN({ // 保留原有跨列笛卡尔积组合 FLATTEN(FLATTEN(FILTER(B2:B,B2:B<>"")&" "&TRANSPOSE(FILTER(C2:C,C2:C<>"")))&" "&TRANSPOSE(FILTER(D2:D,D2:D<>""))), // 新增同行列值组合 FILTER(B2:B&" "&C2:C&" "&D2:D,B2:B<>""*C2:C<>""*D2:D<>"") }))
内容的提问来源于stack exchange,提问作者Capz65
相关产品推荐
相关产品推荐

