You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel批量处理订单:标记批次逾期并去重(公式/VBA实现)

解决Excel中按批次标记逾期并去重的问题

针对你提出的需求——按批次号判断是否存在逾期订单,标记整批次状态后去除重复批次,我提供两种实用方案:


一、Excel公式方案(分版本适配)

适配Excel 365/2021(动态数组函数)

直接用LET+UNIQUE+BYROW组合公式,一步生成结果,无需辅助列:
在空白单元格(比如F2)输入以下公式,回车后自动填充所有结果:

=LET(
    批次列表, UNIQUE(A2:A7),
    逾期状态, BYROW(批次列表, LAMBDA(批次, IF(COUNTIFS(A:A,批次,C:C,"Late")>0,"Late","On Time"))),
    首个订单号, BYROW(批次列表, LAMBDA(批次, INDEX(B:B,MATCH(批次,A:A,0)))),
    HSTACK(批次列表, 首个订单号, 逾期状态)
)

说明

  • 该公式会自动提取唯一批次,判断每个批次是否存在Late订单,同时取该批次的第一个订单号(如果你想取批次中第一个Late订单号,只需调整INDEX部分的匹配条件)
  • 完全匹配你期望的结果格式

适配旧版Excel(无动态数组)

需要借助辅助列和高级筛选:

  1. 添加辅助列判断批次逾期:在D2输入公式,下拉填充到所有行:
    =COUNTIFS($A$2:$A$7,A2,$C$2:$C$7,"Late")>0
    
    该公式返回TRUE表示当前批次存在逾期订单,FALSE表示无逾期。
  2. 高级筛选提取唯一批次
    • 选中源数据区域(A1:C7),点击「数据」→「高级」
    • 勾选「将筛选结果复制到其他位置」,设置「复制到」为空白区域(比如F1),勾选「选择不重复的记录」,点击确定
  3. 补全批次逾期状态:在筛选结果的Late?列(H2)输入公式,下拉填充:
    =IF(VLOOKUP(F2,A:D,4,FALSE),"Late","On Time")
    

二、VBA宏方案(适合批量/重复处理)

如果你需要频繁处理这类数据,写一个VBA宏更高效:

Sub BatchLateStatus()
    Dim wsSource As Worksheet, wsResult As Worksheet
    Dim lastRow As Long, i As Long
    Dim batchDict As Object
    Dim batchNum As String, lateStatus As String, orderNum As String
    
    ' 自定义源工作表(请修改为你的实际表名)
    Set wsSource = ThisWorkbook.Worksheets("Sheet1")
    ' 创建新工作表存放结果
    Set wsResult = ThisWorkbook.Worksheets.Add(After:=wsSource)
    wsResult.Name = "BatchResults"
    
    ' 用字典存储唯一批次的信息
    Set batchDict = CreateObject("Scripting.Dictionary")
    batchDict.CompareMode = vbTextCompare ' 不区分大小写,可根据需求删除
    
    ' 获取源数据最后一行
    lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
    
    ' 遍历源数据,更新批次状态
    For i = 2 To lastRow ' 假设第一行是表头
        batchNum = wsSource.Cells(i, "A").Value
        lateStatus = wsSource.Cells(i, "C").Value
        orderNum = wsSource.Cells(i, "B").Value
        
        ' 如果批次未存入字典,先初始化(默认状态为On Time)
        If Not batchDict.Exists(batchNum) Then
            batchDict.Add batchNum, Array(orderNum, "On Time")
        End If
        
        ' 如果当前订单是Late,更新批次状态为Late
        If lateStatus = "Late" Then
            batchDict(batchNum) = Array(batchDict(batchNum)(0), "Late")
        End If
    Next i
    
    ' 写入结果表头
    wsResult.Cells(1, "A").Value = "Batch Number"
    wsResult.Cells(1, "B").Value = "order Number"
    wsResult.Cells(1, "C").Value = "Late?"
    
    ' 写入结果数据
    i = 2
    For Each key In batchDict.Keys
        wsResult.Cells(i, "A").Value = key
        wsResult.Cells(i, "B").Value = batchDict(key)(0)
        wsResult.Cells(i, "C").Value = batchDict(key)(1)
        i = i + 1
    Next key
    
    ' 自动调整列宽
    wsResult.Columns.AutoFit
    
    MsgBox "处理完成!结果已保存到工作表:" & wsResult.Name, vbInformation
End Sub

使用方法

  1. Alt+F11打开VBA编辑器
  2. 右键点击工作簿→「插入」→「模块」
  3. 粘贴上述代码,修改wsSource的表名为你的实际表名
  4. F5运行宏,结果会自动生成在新工作表中

你的初始数据与期望结果对照

初始数据:

Batch Number order Number Late?
1234         1           Late
1234         2           Late
1234         3           On Time
5678         4           On Time
5678         5           On Time
5678         6           On Time

期望结果:

Batch Number order Number Late?
1234         2           Late
5678         4           On Time

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

火山引擎 最新活动