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
相关产品推荐
相关产品推荐

