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

VBA实现按第一列分组取第二列最大值并标注到第三列求助

Excel分组取最大值VBA实现方案

原代码错误原因

  • 行号变量使用了Double浮点类型,行号为正整数,使用Long类型更合理,也能避免运算误差
  • 调用Max函数时仅传入了当前行的第二列单元格,仅会返回当前行第二列的值,没有纳入同组所有行参与计算
  • 分组逻辑硬编码为判断值1-4,无法适配分组值更多、分组值为非数字的场景

修正后可直接使用的VBA代码

Sub MarkMax()
    Dim lastRow As Long
    Dim i As Long
    ' 自动获取A列最后一条有数据的行号,无需手动修改行范围
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = 1 To lastRow
        ' 按A列分组计算对应B列的最大值,填入当前行C列
        Cells(i, "C") = WorksheetFunction.MaxIfs(Range("B:B"), Range("A:A"), Cells(i, "A").Value)
    Next i
End Sub

兼容旧版Excel的替代方案

如果你使用的Excel版本不支持MaxIfs函数(2016及更早版本无该函数),可以使用以下写法:

Sub MarkMax_OldVersion()
    Dim lastRow As Long
    Dim i As Long, groupVal As Variant
    Dim dataArr, maxDict As Object
    Set maxDict = CreateObject("Scripting.Dictionary")
    
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    dataArr = Range("A1:B" & lastRow).Value
    
    ' 第一次遍历先统计每个分组的最大值
    For i = 1 To UBound(dataArr)
        groupVal = dataArr(i, 1)
        If Not maxDict.exists(groupVal) Then
            maxDict(groupVal) = dataArr(i, 2)
        Else
            If dataArr(i, 2) > maxDict(groupVal) Then
                maxDict(groupVal) = dataArr(i, 2)
            End If
        End If
    Next i
    
    ' 第二次遍历回填最大值到C列
    For i = 1 To lastRow
        Cells(i, "C") = maxDict(Cells(i, "A").Value)
    Next i
End Sub

内容的提问来源于stack exchange,提问作者Layally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:06:03