如何用Excel公式将数值列均分到n组(各组总和相等)
问题描述
需要把Excel中Price列的数值均分到n个组里,要求每组的数值总和完全相等。举两个例子:
- 示例1:Price列总和为10,分成2组,每组总和必须是5
- 示例2:总和为15,分成3组,每组总和必须是5
示例表格如下:
| Price | Group |
|---|---|
| 2 | 1 |
| 2 | 1 |
| 1 | 1 |
| 5 | 2 |
核心前提
必须保证Price列的总和能被分组数n整除,否则根本做不到每组总和相等,先确认这个条件满足再往下操作。
解决方案
优先用Excel公式实现(适用于365/2021及以上版本)
假设Price数据在A2:A5,分组数n=2,先算每组目标值:
- 在任意空白单元格(比如C1)输入目标值公式:
=SUM(A2:A5)/2(把2换成你的n) - 在B2单元格输入动态数组公式,直接生成所有组号:
=LET( prices, A2:A5, target, C1, running_total, SCAN(0, prices, LAMBDA(acc, val, acc+val)), MOD(ROUNDUP(running_total/target, 0)-1, n)+1 )
公式逻辑:先计算Price列的累加和,再用累加和除以目标值向上取整,通过取模运算分配组号,刚好能让每组总和等于目标值。
如果是旧版Excel(没有动态数组),可以用辅助列的贪心逻辑:
- B2手动输入
1 - B3输入公式,下拉到最后一行:
=IF(SUMIF($B$2:B2,B2,$A$2:A2)+A3>$C$1,B2+1,B2)
这个公式会把当前值加到当前组,要是加完超过目标值就自动切换到下一组,最后一组会自动匹配目标(前提是总和能被n整除)。
VBA宏实现(适合大量数据)
如果数据量很大,或者公式不好处理,直接用宏来自动分配:
Sub SplitIntoEqualGroups() Dim ws As Worksheet Dim lastRow As Long Dim totalSum As Double Dim numGroups As Integer Dim targetSum As Double Dim groupSums() As Double Dim i As Long, j As Integer, minIndex As Integer Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 这里可以改成弹窗输入分组数,把下面一行注释掉,打开下一行 numGroups = 2 ' numGroups = InputBox("请输入分组数:") totalSum = Application.Sum(ws.Range("A2:A" & lastRow)) ' 检查总和是否能被分组数整除 If totalSum / numGroups <> Int(totalSum / numGroups) Then MsgBox "总和没法被分组数整除,没法均分!" Exit Sub End If targetSum = totalSum / numGroups ' 初始化每组的当前总和 ReDim groupSums(1 To numGroups) For j = 1 To numGroups groupSums(j) = 0 Next j ' 把每个价格分配到当前总和最小的组 For i = 2 To lastRow minIndex = 1 ' 找当前总和最小的组 For j = 2 To numGroups If groupSums(j) < groupSums(minIndex) Then minIndex = j End If Next j ' 写入组号 ws.Cells(i, "B").Value = minIndex ' 更新该组总和 groupSums(minIndex) = groupSums(minIndex) + ws.Cells(i, "A").Value Next i End Sub
使用方法:按Alt+F11打开VBA编辑器,插入模块,把代码粘进去,运行宏就行。代码里默认分组数是2,你可以改成弹窗输入的形式(把注释打开就行)。
注意点
- 再次强调:总和必须能被n整除,不然所有方法都没用
- 公式法在数据顺序特殊时可能需要调整,但只要总和符合条件,最终结果肯定能均分
- 宏的方法是贪心算法,会自动把每个值加到当前最“空”的组,分配逻辑更稳定
内容的提问来源于stack exchange,提问作者Logout_rn
相关产品推荐
相关产品推荐

