Excel公式开发:单项目限用一次的多列取值最大和及使用顺序查询
解决Excel中“每列选一个值、项目不重复”的最大总和问题
嘿,你之前尝试的分步找每列最大值的思路其实有个致命问题:很容易选到重复的项目,或者错过全局最优的组合(比如某个项目在A列是次大,但在B列是超大,组合起来总和反而更高)。这个问题本质是指派问题(Assignment Problem),属于线性规划的范畴,用Excel的「规划求解」工具就能完美解决,还能同时得到选中的项目顺序。
下面是具体操作步骤,假设你的数据是:
- A1:A10:10个项目名称
- B1:K10:每个项目对应的10列数值
一、准备辅助区域
- 建立决策矩阵:比如选中M1:V10这个10×10的区域,每个单元格代表「是否选择第i行的项目对应第j列的数值」(M列对应B列,V列对应K列),后续我们会让这里的单元格只能是0(不选)或1(选中)。
- 设置目标总和单元格:比如W1,输入公式:
这个公式会自动计算选中数值的总和。=SUMPRODUCT(B1:K10,M1:V10)
二、启用并配置规划求解
- 如果你的Excel里找不到「规划求解」,先去「文件」→「选项」→「加载项」,找到「规划求解加载项」并启用它,之后就能在「数据」选项卡里看到它了。
- 打开规划求解,按以下配置:
- 目标单元格:选W1,设置为「最大值」
- 可变单元格:选中M1:V10(就是我们的决策矩阵)
- 添加约束条件:
- 点击「添加」,设置
M1:V10「等于」「二进制」(这样每个单元格只能是0或1) - 再添加:每行的和≤1(保证每个项目最多用一次),比如选中M1:V1,设置
=SUM(M1:V1) ≤1,然后把这个约束复制到A2:A10对应的所有行 - 最后添加:每列的和=1(保证每列必须选一个值),比如选中M1:M10,设置
=SUM(M1:M10)=1,复制到B到K对应的所有列
- 点击「添加」,设置
- 点击「求解」,Excel会自动计算出最优组合,决策矩阵里的「1」就代表选中的项目和对应列。
三、提取项目使用顺序
要得到每列对应的选中项目,只需要用INDEX+MATCH公式:
- 比如B列对应的项目,输入:
=INDEX(A:A,MATCH(1,M1:M10,0)) - 把这个公式依次复制到C到K列对应的单元格,就能得到完整的项目使用顺序啦。
小贴士:如果你的项目数量和列数不一致(比如项目多于10个),只需要调整决策矩阵的大小,约束条件改成「每行和≤1」「每列和=1」就可以,逻辑是一样的。
内容的提问来源于stack exchange,提问作者Arkadeusz91




