更改项目时间表以根据工作日,周或月显示小时数

时间:2016-06-19 22:21:21

标签: vba excel-vba date excel

给定文件显示项目的正确小时分布,但是,其时间轴在范围I5:JI5中没有显示正确的工作月份。工作日来了,我假设一周内有5个工作日,而这个月我想准确计算一个月内的工作日数。现在,我假设一个月有22个工作日。但是由此产生的工作日功能并没有让我在时间轴中得到正确的日期。

e.g。

  1. 如果您从下拉列表中选择DAY并查看实际结束日期,则日期为 所有工作日(周六,周日除外)都没问题。

  2. 如果您从下拉列表中选择WEEK并查看实际结束日期,则周日期不同。在时间线的日期下,小时数也没有正确下降。

  3. 如果您从下拉列表中选择MONTH并查看实际结束日期,则月份日期也不相同。此外,时间表中各个小时的时间也没有正确下降。

  4. 我的意思是,理想情况下,对于所有3个选项,实际结束日期应该相同,小时应该从时间线上的开始日期开始。

    以下是3个选项的屏幕截图: When DAY is selected

    When WEEK is selected

    When MONTH is selected

    这里是更新的文件(可共享的链接):

    PSchedule Template.xlsx

1 个答案:

答案 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

编辑:每期的总计算可以在第一次完成下一次,我做了调试。