Excel VBA按收货日期统计工作日求助:含循环、假日列表等问题
VBA批量统计工作日天数:下单到收货/当日,支持外部假日列表
需求概述
- 统计**A列(下单日期)到C列(收货日期)**的工作日天数
- 若C列未填写收货日期,自动统计至当日的工作日天数
- 需批量处理多行数据
你尝试的代码
sub count() dim rd as boolean if range("c2").value +>1 then rd = true else rd = false if rd = true then range("b2").value = worksheetfunction.networkdays(range("a2"), range("c2")) end if end if end sub
你的问题
- 如何在
NetworkDays函数中引用第二个工作表的假日列表 - 如何实现多行数据的循环遍历
- 收货日期未填写时的统计逻辑编写
- 解决工作表对象引用的问题,确保日期统计准确
完整解决方案代码
Sub CalculateWorkDays() ' 定义工作表对象,明确操作目标 Dim wsData As Worksheet Dim wsHolidays As Worksheet Dim lastRow As Long Dim i As Long Dim startDate As Date Dim endDate As Date ' 指定数据工作表和假日列表工作表(根据你的实际表名修改) Set wsData = ThisWorkbook.Worksheets("订单数据") Set wsHolidays = ThisWorkbook.Worksheets("假日列表") ' 获取A列最后一行数据,确定循环范围 lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row ' 从第2行开始循环(假设第1行是表头) For i = 2 To lastRow ' 获取当前行的下单日期 startDate = wsData.Cells(i, "A").Value ' 确定结束日期:优先用收货日期,无则用当日 If IsDate(wsData.Cells(i, "C").Value) Then endDate = wsData.Cells(i, "C").Value Else endDate = Date End If ' 计算工作日,引用假日列表(假日列表在wsHolidays的A列) On Error Resume Next ' 容错:处理日期格式错误的情况 wsData.Cells(i, "B").Value = WorksheetFunction.NetworkDays(startDate, endDate, wsHolidays.Range("A:A")) On Error GoTo 0 Next i End Sub
问题逐一解决说明
1. 引用外部工作表的假日列表
在NetworkDays的第三个参数中直接指定假日列表的工作表和范围,示例中是wsHolidays.Range("A:A"),确保假日列表工作表的A列存储的是合法日期格式即可。
2. 批量遍历多行数据
- 用
wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row获取A列最后一行的行号,自动适配数据行数变化 - 通过
For i = 2 To lastRow循环遍历每一行数据,覆盖所有有效行
3. 未填写收货日期的统计逻辑
使用IsDate()函数判断C列单元格是否为有效日期:
- 若为有效日期,将其作为结束日期
- 若无效(未填写或格式错误),调用
Date函数获取系统当日日期作为结束日期
4. 解决工作表引用问题
通过定义并指定Worksheet对象(wsData和wsHolidays),所有单元格操作都明确指向对应的工作表,避免了直接使用Range()时默认引用当前激活工作表的混乱问题,确保统计逻辑的准确性。
内容的提问来源于stack exchange,提问作者Benjamin Hegenderfer
相关产品推荐
相关产品推荐

