You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel公式将数值列均分到n组(各组总和相等)

问题描述

需要把Excel中Price列的数值均分到n个组里,要求每组的数值总和完全相等。举两个例子:

  • 示例1:Price列总和为10,分成2组,每组总和必须是5
  • 示例2:总和为15,分成3组,每组总和必须是5

示例表格如下:

PriceGroup
21
21
11
52
核心前提

必须保证Price列的总和能被分组数n整除,否则根本做不到每组总和相等,先确认这个条件满足再往下操作。

解决方案

优先用Excel公式实现(适用于365/2021及以上版本)

假设Price数据在A2:A5,分组数n=2,先算每组目标值:

  1. 在任意空白单元格(比如C1)输入目标值公式:=SUM(A2:A5)/2(把2换成你的n)
  2. 在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(没有动态数组),可以用辅助列的贪心逻辑:

  1. B2手动输入1
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:25:28