在 table(或查询)中为 Access 中的网络天数创建字段

Create field in a table (or query) for Network Days in Access

我知道Access不直接支持Network days。我也知道我可以使用 VBA 来解决表单上一条记录的任意两个值的网络天数。但是,我想解决 table 中所有记录的网络天数。示例:需要找到 open/completed/whatever 少于特定数量 "work week days" 的记录的百分比)为此,我需要一列记录每个项目花费了多少网络天数。

我已经尝试按照查询设计来创建新字段。

测试:DateDiff([开始日期],[结束日期],"d")-(((DateDiff([开始日期],[结束日期],"d")+工作日( [发起日期],3)-工作日([结束日期],3))/7)2)+1(工作日([发起日期],3)>5)-(工作日([关闭日期],3)-4)*(工作日([关闭日期],3)>4)

我已经尝试了一些我在网上找到的变体,但这是我唯一要执行的变体,但所有值都带有#Error。

((旁注:在设计视图中,我在查询的 "Field" 区域中将其作为一条连续线输入。有点像如何直接通过以下方式创建新字段使用.... Newfieldname:[Field1]*[Field2] 。我只是提出这个,因为有人认为有必要编辑我的 post 并将 Test: 移到它自己的行....谁知道也许我对 Test:([extensive stuff]) 的使用是问题的一部分!!!?如果有人从字面上说 "this is "stuff",我 "had" "somewhere"))

我尝试过的另一个选择是在 VBA 中创建一个新字段,但让 fld.Expression 引用一个函数。 (我不相信我能做到,甚至可能做不到正确...)

注意:'tblVBA 是一个临时值 table(我没有存储这些计算值。)

Private Sub btncreate_Click()
    Dim db As DAO.Database
    Dim TD As DAO.TableDef
    Dim fld As DAO.Field

    Set db = CurrentDb()
    Set TD = db.TableDefs("tblVBA") 

    Set fld = TD.CreateField("TotNetWrkDays", dbInteger)
    fld.Expression = wNetworkdays([Initiated Date], [Closed Date])
    TD.Fields.Append fld
    MsgBox "Added"
End Sub

Public Function wNetworkdays(beginDt As Date, endDt As Date) As Integer
    Dim tempDt As Date
    Dim count As Integer
    tempDt = beginDt

    For i = 1 To DateDiff("d", beginDt, endDt)
        tempDt = DateAdd("d", 1, tempDt)
        If Weekday(tempDt, 2) = 6 Or Weekday(tempDt, 2) = 7 Then  'Define your scheduled day off, you can define weekday instead of weekend
            count = count + 1
        End If
    Next i
    wNetworkdays = DateDiff("d", beginDt, endDt) + 1 - count
End Function

我当然可以在 excel 中完成所有这些...但是,不幸的是只能在 excel.[=12 中的数据库之外找到一些简单的统计数据=]



更新:2017 年 11 月 2 日 2:30PM 非常感谢 Kostas K.!!!我没有意识到您可以从本质上解决我的问题的查询中调用函数。但是,我确实使用了我的原始函数作为提供的解决方案...示例:在 2016 年 3 月 17 日和 2016 年 8 月 11 日之间产生的结果是 105,而不是 excels NETWORKDAYS 给出的结果是 106。代码 I posted 之前(顺便说一句,我在网上找到的)确实像 excel 一样给出了 106。 *对于所有关闭日期不可用的情况,我仍需要添加一个 return Null .. 但无论哪种方式,问题都已回答,谢谢!

您可以使用下面的函数来计算两个日期之间的工作日数(不包括周末)。

然后您只需在查询中调用该函数即可。

Public Function WeekdaysInDateRange(ByVal DateFrom As Date, ByVal DateTo As Date) As Long
    Dim weeks As Long
        weeks = CLng((((DateTo - Weekday(DateTo)) - (DateFrom - Weekday(DateFrom) + 1)) / 7) * 5)

    Dim days As Long
        days = Weekday(DateTo) - Weekday(DateFrom) + 1 + IIf(Weekday(DateFrom) = 1, -1, 0) + IIf(Weekday(DateTo) = 7, -1, 0)

    WeekdaysInDateRange = weeks + days
End Function


注意 DateFrom 不包括在计算中。