如何移除基于二进制模式的无VBA组合生成工具的辅助列
移除辅助列的组合生成方案
嘿,我懂你想要简化这个组合工具的需求——那些辅助列确实有点占地方,咱们直接用公式一步到位生成所有组合,完全不需要中间的二进制列和辅助列,试试看下面的方法:
针对Excel 365/2021(支持动态数组)
假设你的项目放在首行的B1:E1区域,直接在任意空白单元格(比如A2)输入这个动态数组公式,它会自动溢出所有非空组合:
=LET( items, B1:E1, item_count, COUNTA(items), combo_numbers, SEQUENCE(2^item_count - 1), BYROW(combo_numbers, LAMBDA(num, TEXTJOIN(", ", TRUE, IF(BITAND(num, 2^(SEQUENCE(item_count)-1)), items, "")) )) )
公式说明:
LET函数帮咱们定义了几个变量,让逻辑更清晰:items:直接引用你的项目所在区域item_count:自动统计项目的总数量combo_numbers:生成从1到2^item_count-1的序列,每个数字对应一个非空组合的二进制编码
BYROW会逐个处理每个组合编号,用BITAND检查该编号的每一位二进制是否为1——如果是,就把对应的项目加入组合,最后用TEXTJOIN把选中的项目拼接成易读的字符串。
如果需要包含空组合,只需要把2^item_count - 1改成2^item_count就行。
针对旧版Excel(无动态数组)
如果你用的是不支持动态数组的旧版Excel,也可以用数组公式直接生成:
- 先计算总组合数:在某个单元格输入
=2^COUNTA(B1:E1)-1,得到需要填充的行数 - 在A2单元格输入下面的公式,然后按Ctrl+Shift+Enter确认(数组公式的输入方式),再向下填充到计算好的行数:
=TEXTJOIN(", ", TRUE, IF(BITAND(ROW()-1, 2^(COLUMN(B1:E1)-COLUMN(B1))), B1:E1, ""))
这个公式的逻辑和上面类似,通过ROW()-1获取当前组合的二进制编号,用BITAND匹配对应项目,最后拼接成组合字符串,全程不需要任何辅助列。
这样一来,你就可以彻底去掉原来的A列二进制和B-E列的辅助列,直接得到所有项目组合啦!
内容的提问来源于stack exchange,提问作者Gary's Student
相关产品推荐
相关产品推荐

