如何用VBA实现计划与交付日期对比,统计按时/延迟交付数量
需求与问题说明
需要对比计划日期与交付日期,统计两类状态:
- 交付日期(SentDate,对应C列)≤计划日期(Scheduled Date,对应B列):计为「按时」
- 交付日期>计划日期:计为「延迟」
数据示例
| ITEM | Scheduled Date | SentDate |
|---|---|---|
| A | 9/20/2018 | 9/20/2019 |
| B | 9/20/2018 | 1/5/2023 |
| C | 9/20/2018 | 2/2/2022 |
| D | 9/20/2018 | 7/3/2021 |
原代码问题
你当前的VBA代码逻辑错误,无法实现需求:
Sub datetest() Range("A10") = Application.WorksheetFunction.CountIf(Range(C:C),"> B") End Sub
错误点:
Range(C:C)直接引用整列,未限定有效数据范围,效率低且易误判- 条件
"> B"写法无效,没有指定具体单元格(如B2),也无法实现逐行对比B、C列日期的逻辑
解决方案
方案1:用Excel公式快速统计(无需VBA)
直接在单元格输入公式即可,把范围替换成你实际的数据行:
- 统计延迟数量:
=SUMPRODUCT(--(C2:C5>B2:B5)) - 统计按时数量:
=SUMPRODUCT(--(C2:C5<=B2:B5))
方案2:正确的VBA实现
写法1:逐行循环判断(新手友好)
Sub CountDeliveryStatus() Dim ws As Worksheet Dim lastRow As Long Dim onTimeCount As Long, delayedCount As Long Dim i As Long ' 指定目标工作表,改成你实际的表名 Set ws = ThisWorkbook.Worksheets("Sheet1") ' 获取数据最后一行的行号 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row onTimeCount = 0 delayedCount = 0 ' 从第2行开始循环(跳过表头) For i = 2 To lastRow ' 先判断单元格是否为有效日期,避免文本干扰 If IsDate(ws.Cells(i, "B").Value) And IsDate(ws.Cells(i, "C").Value) Then If ws.Cells(i, "C").Value <= ws.Cells(i, "B").Value Then onTimeCount = onTimeCount + 1 Else delayedCount = delayedCount + 1 End If End If Next i ' 输出结果到指定单元格 ws.Range("A10").Value = "按时数量:" & onTimeCount ws.Range("A11").Value = "延迟数量:" & delayedCount End Sub
写法2:调用工作表函数(高效简洁)
Sub CountDeliveryStatus_Efficient() Dim ws As Worksheet Dim lastRow As Long Dim onTimeCount As Long, delayedCount As Long Set ws = ThisWorkbook.Worksheets("Sheet1") lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 用Evaluate调用SUMPRODUCT完成计算 onTimeCount = ws.Evaluate("SUMPRODUCT(--(C2:C" & lastRow & "<=B2:B" & lastRow & "))") delayedCount = ws.Evaluate("SUMPRODUCT(--(C2:C" & lastRow & ">B2:B" & lastRow & "))") ws.Range("A10").Value = "按时:" & onTimeCount ws.Range("A11").Value = "延迟:" & delayedCount End Sub
内容的提问来源于stack exchange,提问作者newbiePM
相关产品推荐
相关产品推荐

