在 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
不包括在计算中。
我知道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
不包括在计算中。