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

工作日计算函数(含节假日排除)功能异常求助

问题排查与修复方案

你的代码无法排除节假日,核心是两个关键问题导致的,以下是针对性修复:

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

验证步骤

  1. 确认tblHolidays的HolidayDate字段为日期/时间类型,且已填入测试用的工作日节假日(比如某个周一的日期)。
  2. 调用DateDiffWorkdays时传入包含该节假日的日期范围,第三个参数传False或留空,检查返回的工作日数是否已排除该日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:09:50