求Excel公式/VBA代码:提取A列重复项对应C列最大值的A:C数据
提取重复项对应C列最大值的整行数据
公式解法
适用于Excel 365/2021(支持动态数组)
- 获取A列唯一值:在空白列(比如D列)输入
=UNIQUE(A2:A100)(替换A2:A100为你的实际数据范围,避免整列引用拖慢效率),自动生成所有不重复的A列值。 - 匹配对应C列最大值:在E2输入
=MAXIFS(C2:C100,A2:A100,D2),下拉填充,得到每个唯一A值对应的最大Coverage。 - 匹配对应B列描述:在F2输入
=XLOOKUP(1,(A2:A100=D2)*(C2:C100=E2),B2:B100),下拉填充即可获取对应描述。
适用于旧版Excel(无动态数组)
用数组公式实现,选中需要输出结果的A、B、C列对应单元格,输入:
=INDEX(A:C,MATCH(1,(A:A=D2)*(C:C=MAXIFS(C:C,A:A,D2)),0),COLUMN(A:C))
按Ctrl+Shift+Enter完成数组公式输入,下拉填充即可。
你之前的公式失效原因:错误将B列作为取最大值的目标列,且未同时匹配A列条件与C列最大值的对应关系,导致逻辑偏差。
VBA解法
直接运行以下代码,会自动生成新工作表存放结果:
Sub ExtractMaxCoverage() Dim ws As Worksheet, newWs As Worksheet Dim lastRow As Long, i As Long Dim dict As Object Dim key As Variant, currentCoverage As Double Set ws = ActiveSheet Set newWs = ThisWorkbook.Sheets.Add(After:=ws) newWs.Name = "MaxCoverageResult" ' 复制表头 newWs.Range("A1:C1").Value = ws.Range("A1:C1").Value Set dict = CreateObject("Scripting.Dictionary") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 遍历数据,记录每个A列值的最大Coverage及对应B值 For i = 2 To lastRow key = ws.Cells(i, "A").Value currentCoverage = ws.Cells(i, "C").Value If Not dict.Exists(key) Then dict.Add key, Array(ws.Cells(i, "B").Value, currentCoverage) Else If currentCoverage > dict(key)(1) Then dict(key) = Array(ws.Cells(i, "B").Value, currentCoverage) End If End If Next i ' 写入结果 i = 2 For Each key In dict.Keys newWs.Cells(i, "A").Value = key newWs.Cells(i, "B").Value = dict(key)(0) newWs.Cells(i, "C").Value = dict(key)(1) i = i + 1 Next key MsgBox "提取完成,结果已保存到新工作表" End Sub
内容的提问来源于stack exchange,提问作者richhodg
相关产品推荐
相关产品推荐

