工作日计算函数(含节假日排除)功能异常求助
问题排查与修复方案
你的代码无法排除节假日,核心是两个关键问题导致的,以下是针对性修复:
1. 表名不匹配
在GetHolidays函数中,硬编码的表名是ListHolidays_tbl,但你实际创建的表是tblHolidays,这直接导致函数无法读取到节假日数据。
修复: 修改函数内的表名常量:
' 原代码 Const cstrTable As String = "ListHolidays_tbl" ' 修改为 Const cstrTable As String = "tblHolidays"
2. 记录数获取不准确
DAO快照类型的记录集默认不会加载所有数据,直接读取rst.RecordCount可能返回0(即使表中有数据),导致无法生成节假日数组。
修复: 打开记录集后,先移动到最后一条记录再返回开头,确保获取准确的记录数:
Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot) ' 新增以下两行 rst.MoveLast rst.MoveFirst ' 保存当前日期参数 datDate1Last = datDate1 datDate2Last = datDate2
修复后的完整GetHolidays函数
Public Function GetHolidays( _ ByVal datDate1 As Date, _ ByVal datDate2 As Date, _ Optional ByVal booDesc As Boolean) _ As Date() ' 查找datDate1和datDate2之间的节假日,返回日期数组。 ' DAO对象声明为静态以加速相同日期参数的重复调用。 ' 2014-10-03. Cactus Data ApS, CPH ' 存储节假日的表(已修改为你的表名) Const cstrTable As String = "tblHolidays" ' 存储节假日日期的字段 Const cstrField As String = "HolidayDate" ' 数组常量 Const clngDimRecordCount As Long = 2 Const clngDimFieldOne As Long = 0 Static dbs As DAO.Database Static rst As DAO.Recordset Static datDate1Last As Date Static datDate2Last As Date Dim adatDays() As Date Dim avarDays As Variant Dim strSQL As String Dim strDate1 As String Dim strDate2 As String Dim strOrder As String Dim lngDays As Long If DateDiff("d", datDate1, datDate1Last) <> 0 Or DateDiff("d", datDate2, datDate2Last) <> 0 Then ' 日期参数变更,重新查询 strDate1 = Format(datDate1, "\#yyyy\/mm\/dd\#") strDate2 = Format(datDate2, "\#yyyy\/mm\/dd\#") strOrder = Format(booDesc, "\A\s\c;\D\e\s\c") strSQL = "Select " & cstrField & " From " & cstrTable & " " & _ "Where " & cstrField & " Between " & strDate1 & " And " & strDate2 & " " & _ "Order By 1 " & strOrder Set dbs = CurrentDb Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot) ' 新增:获取准确的记录数 rst.MoveLast rst.MoveFirst ' 保存当前日期参数 datDate1Last = datDate1 datDate2Last = datDate2 End If lngDays = rst.RecordCount If lngDays = 0 Then ' 无节假日,返回空数组 Else ReDim adatDays(lngDays - 1) rst.MoveFirst avarDays = rst.GetRows(lngDays) For lngDays = LBound(avarDays, clngDimRecordCount) To UBound(avarDays, clngDimRecordCount) adatDays(lngDays) = avarDays(clngDimFieldOne, lngDays) Next End If GetHolidays = adatDays() End Function
验证步骤
- 确认
tblHolidays的HolidayDate字段为日期/时间类型,且已填入测试用的工作日节假日(比如某个周一的日期)。 - 调用
DateDiffWorkdays时传入包含该节假日的日期范围,第三个参数传False或留空,检查返回的工作日数是否已排除该日期。
内容的提问来源于stack exchange,提问作者teri bridges
相关产品推荐
相关产品推荐

