给定文件显示项目的正确小时分布,但是,其时间轴在范围I5:JI5中没有显示正确的工作月份。工作日来了,我假设一周内有5个工作日,而这个月我想准确计算一个月内的工作日数。现在,我假设一个月有22个工作日。但是由此产生的工作日功能并没有让我在时间轴中得到正确的日期。
e.g。
如果您从下拉列表中选择DAY并查看实际结束日期,则日期为 所有工作日(周六,周日除外)都没问题。
如果您从下拉列表中选择WEEK并查看实际结束日期,则周日期不同。在时间线的日期下,小时数也没有正确下降。
如果您从下拉列表中选择MONTH并查看实际结束日期,则月份日期也不相同。此外,时间表中各个小时的时间也没有正确下降。
我的意思是,理想情况下,对于所有3个选项,实际结束日期应该相同,小时应该从时间线上的开始日期开始。
这里是更新的文件(可共享的链接):
答案 0 :(得分:1)
我不得不说,这是其中一个有趣的问题。我花了一些时间想出一个简单的解决方案。我将如何将工作表上的值填充到OP:)。
Dim aWork()
Dim iNoOfDay As Integer
Dim n As Integer
Dim dStart As Date
Dim dEnd As Date
Dim sCurPeriod As String
Dim sPeriod As String
Dim iCurPeriod As Integer
Dim dTotalPeriod As Double
sPeriod = "W" ' W = Weekly, M = Monthly
dStart = CDate("10 Jan 2016")
dEnd = CDate("12 Feb 2016")
iNoOfDay = DateDiff("d", dStart, dEnd)
' 0 - date, 1 - work hours, 2 - period starts from 1
ReDim aWork(iNoOfDay, 2)
iCurPeriod = 0
For n = 0 To iNoOfDay
aWork(n, 0) = DateAdd("d", n, dStart)
' Set to 0 on weekends 1 = sunday, 7 = saturday may be different depending on your regional setting
aWork(n, 1) = IIf(DatePart("w", aWork(n, 0)) <> 1 And DatePart("w", aWork(n, 0)) <> 7, 7.5, 0)
If sPeriod = "W" Then
If sCurPeriod <> DatePart("yyyy", aWork(n, 0)) & DatePart("ww", aWork(n, 0)) Then
sCurPeriod = DatePart("yyyy", aWork(n, 0)) & DatePart("ww", aWork(n, 0))
iCurPeriod = iCurPeriod + 1
End If
ElseIf sPeriod = "M" Then
If sCurPeriod <> DatePart("yyyy", aWork(n, 0)) & DatePart("m", aWork(n, 0)) Then
sCurPeriod = DatePart("yyyy", aWork(n, 0)) & DatePart("m", aWork(n, 0))
iCurPeriod = iCurPeriod + 1
End If
End If
aWork(n, 2) = iCurPeriod
Next
iCurPeriod = 0
For n = 0 To iNoOfDay
If iCurPeriod <> aWork(n, 2) Then
Debug.Print iCurPeriod, dTotalPeriod
iCurPeriod = aWork(n, 2)
dTotalPeriod = 0
End If
dTotalPeriod = dTotalPeriod + aWork(n, 1)
Next
Debug.Print iCurPeriod, dTotalPeriod
编辑:每期的总计算可以在第一次完成下一次,我做了调试。