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

如何用VBA实现计划与交付日期对比,统计按时/延迟交付数量

需求与问题说明

需要对比计划日期与交付日期,统计两类状态:

  • 交付日期(SentDate,对应C列)≤计划日期(Scheduled Date,对应B列):计为「按时」
  • 交付日期>计划日期:计为「延迟」

数据示例

ITEMScheduled DateSentDate
A9/20/20189/20/2019
B9/20/20181/5/2023
C9/20/20182/2/2022
D9/20/20187/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:10:50