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

将指定列(及关联列)的最大值行移至Sheet 2

解决按交货日期提取Top10交付量记录的问题

嘿,我来帮你搞定这个需求!看起来你需要按交货日期分组,把每组里需交付产品数量最高的10条记录移到Sheet2,对吧?这里有两种实用的方法,你可以根据自己的情况选择:

方法1:用Excel内置功能(无需编程)

如果数据量不算特别大,手动操作配合内置功能就能搞定:

  • 先给数据加好表头:确保A1是「交货日期」、P1是「需交付产品数量」,这样后续筛选排序更顺畅。
  • 按交货日期分组:选中整个数据区域(A1:P585),点击「数据」选项卡→「排序」,主要关键字选「交货日期」,确定后同一日期的记录会自动排在一起。
  • 新增组内排名辅助列:在Q2单元格输入数组公式 =RANK.EQ(P2,IF($A$2:$A$585=A2,$P$2:$P$585,""),0),Excel 365及以后版本直接回车,旧版本按 Ctrl+Shift+Enter 确认。这个公式会计算当前行的交付量在同日期组里的排名。
  • 筛选并移动记录:点击Q列表头的筛选箭头,选择「数字筛选」→「小于或等于」,输入10,确定后所有日期组的Top10记录都会显示出来。选中这些记录(包括A到P列),右键剪切,切换到Sheet2粘贴即可。

要是你不想用辅助列,也可以逐个日期处理:

  • 点击「数据」→「筛选」,通过「交货日期」的筛选箭头单独显示某一日期的记录。
  • 选中P列的交付量数据,按「数据」→「排序」,选「降序」,把数量最高的排到最前面。
  • 选中前10条记录剪切到Sheet2,重复这个操作直到所有日期处理完。

方法2:用VBA脚本自动完成(适合大量数据)

如果日期组很多,手动操作太费时间,写个VBA脚本一键搞定:

  1. 打开Excel,按 Alt+F11 打开VBA编辑器。
  2. 右键左侧的「VBAProject」→「插入」→「模块」,粘贴下面的代码:
Sub MoveTop10PerDate()
    Dim wsSource As Worksheet, wsTarget As Worksheet
    Dim lastRow As Long, targetRow As Long
    Dim dateRange As Range, cell As Range
    Dim uniqueDates As Collection
    Dim currentDate As Variant
    Dim tempRange As Range
    
    ' 替换成你的实际工作表名称
    Set wsSource = ThisWorkbook.Sheets("Sheet1")
    Set wsTarget = ThisWorkbook.Sheets("Sheet2")
    targetRow = 1 ' 目标表从第一行开始粘贴表头
    
    ' 复制表头到目标表
    wsSource.Rows(1).Copy wsTarget.Rows(targetRow)
    targetRow = targetRow + 1
    
    ' 获取所有唯一的交货日期
    Set uniqueDates = New Collection
    lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
    Set dateRange = wsSource.Range("A2:A" & lastRow)
    
    On Error Resume Next
    For Each cell In dateRange
        If cell.Value <> "" Then
            uniqueDates.Add cell.Value, Key:=CStr(cell.Value)
        End If
    Next cell
    On Error GoTo 0
    
    ' 遍历每个日期,提取Top10记录
    For Each currentDate In uniqueDates
        ' 筛选当前日期的记录
        wsSource.Range("A1:P" & lastRow).AutoFilter Field:=1, Criteria1:=currentDate
        Set tempRange = wsSource.Range("P2:P" & lastRow).SpecialCells(xlCellTypeVisible)
        
        If Not tempRange Is Nothing Then
            ' 按交付量降序排序
            wsSource.Sort.SortFields.Clear
            wsSource.Sort.SortFields.Add2 Key:=wsSource.Range("P1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            With wsSource.Sort
                .SetRange wsSource.Range("A1:P" & lastRow)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            ' 复制前10条到目标表
            wsSource.Range("A2:P" & lastRow).SpecialCells(xlCellTypeVisible).Resize(10).Copy _
                wsTarget.Cells(targetRow, 1)
            targetRow = targetRow + 10
        End If
    Next currentDate
    
    ' 取消筛选
    wsSource.AutoFilterMode = False
    MsgBox "操作完成!已将每个日期组的Top10记录移到Sheet2。", vbInformation
End Sub
  1. 把代码里的Sheet1和Sheet2改成你实际的工作表名称(如果源表不是默认的Sheet1)。
  2. 回到Excel,按 Alt+F8,选择MoveTop10PerDate,点击「运行」,脚本会自动完成所有操作。

注意事项

  • 确保数据里没有合并单元格,否则会影响排序和筛选的准确性。
  • 如果某个日期组的记录不足10条,脚本会自动把该组的所有记录移过去。
  • 运行VBA前建议先备份数据,防止意外情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:33:22