尝试获取2个日期之间的差异(3个不同的单元格)

时间:2019-04-28 16:44:53

标签: excel vba

能否请您帮我获取两个日期之间的差额(仅工作时间,这很重要)

看看这张图片:

Image

首次答复是通过以下方式计算的:日期首次答复和问题日期

已用时间是通过以下方式计算的:上次响应日期和问题日期

到目前为止,这是我的宏(无法正常工作):

int main()
{
    char** strings = malloc(1000 * sizeof(char));
    int index = 0;
    StringBundle** bundle = malloc(1000 * sizeof(StringBundle)); //StringBundle is used to parse the string

    while (fgets(str, 500, file))
    {
        bundle[index] = createStringBundle(str); //String bundle works correctly
        char** tokens = bundle[index]->Tokens; //Gets the parts of a parsed string
        char concat[100]; //This string is composed of two parts of the string that is parsed
        strcpy(concat, tokens[1]);
        strcat(concat, tokens[3]);
        printf("%s\n", concat) //This will print the correct value, so the value of concat is correct
        strings[index] = concat;
        index++;
    }
    //"Montery CA" is the last value added to the array
    printf("%s\n", strings[2]); //Issue- this will print "Montery CA", when it should print "Chicago IL"
    printf("%s\n", strings[13]); //Issue- this will print "Montery CA", when it should print "San Diego CA"
}

编辑#1:我应该获得周一至周五的工作时间(不包括周末,但我不知道该怎么做)

编辑#2:差异应在小时

中显示

编辑#3:以前,我正在使用此宏(一切正常,但我没有得到工作时间)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Const WORKING_DAY_START As String = "09:00"
Const WORKING_DAY_END As String = "18:00"
Const FORMULA_WORKING_TIME As String = _
    "=(INT(E2-D2)*(""" & WORKING_DAY_END & """-""" & WORKING_DAY_START & """)" & _
    "+MEDIAN(MOD(E2,1),""" & WORKING_DAY_END & """,""" & WORKING_DAY_START & """)" & _
    "-MEDIAN(MOD(D2,1),""" & WORKING_DAY_END & """,""" & WORKING_DAY_START & """))"
Const FORMULA_ELAPSED_TIME As String = "=F2-D2"
Dim lastrow As Long

    On Error GoTo ws_bdc_exit

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    With Me

        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row

        'input Elapsed Time
        .Range("H2").Resize(lastrow - 1).Formula = FORMULA_ELAPSED_TIME

        'input First Response time
        .Range("G2").Resize(lastrow - 1).Formula = FORMULA_WORKING_TIME

        With .Range("G2:H2").Resize(lastrow - 1)
            .Value = .Value
            .NumberFormat = "##0.00"
        End With
    End With

ws_bdc_exit:
    Target.Offset(1).Select

    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

2 个答案:

答案 0 :(得分:0)

我编写了一个仅计算周一至周五工作时间的函数。

请注意,在您发布的示例中,某些日期位于周六/周日,因此将计算为零。

算法:

  • 将周一至周五每天的工作时间计算为WORKING_DAY_START - WORKING_DAY_END`小时。
  • 如果一天恰好是要计算的第一天或最后一天,请进行调整。

您可以在工作表本身上使用此函数,也可以从仅用值填充单元格的宏中调用。

下面,我将显示您的原始数据,以及一些额外的行,这些行会更改您的周末工作日期。

Option Explicit
Function elapsedWorkTime(startDT As Date, endDt As Date) As Date
    Const WORKING_DAY_START As Date = #9:00:00 AM#
    Const WORKING_DAY_END As Date = #6:00:00 PM#
    Dim adjTimeStart As Date, adjTimeEnd As Date, totTime As Date
    Dim D As Date

For D = DateValue(startDT) To DateValue(endDt)
    Select Case Weekday(D)
        Case 2 To 6
            'Adj for first and last days
            If D = DateValue(startDT) Then
                If TimeValue(startDT) <= WORKING_DAY_START Then
                    adjTimeStart = 0
                ElseIf TimeValue(startDT) >= WORKING_DAY_END Then
                    adjTimeStart = WORKING_DAY_START - WORKING_DAY_END
                Else
                    adjTimeStart = WORKING_DAY_START - TimeValue(startDT)
                End If
            End If

            If D = DateValue(endDt) Then
                If TimeValue(endDt) >= WORKING_DAY_END Then
                    adjTimeEnd = 0
                ElseIf TimeValue(endDt) <= WORKING_DAY_START Then
                    adjTimeEnd = WORKING_DAY_START - WORKING_DAY_END
                Else
                    adjTimeEnd = TimeValue(endDt) - WORKING_DAY_END
                End If
            End If

            totTime = totTime + WORKING_DAY_END - WORKING_DAY_START
    End Select
Next D

elapsedWorkTime = totTime + adjTimeStart + adjTimeEnd

End Function

编辑,更正了屏幕截图的格式

请注意,由于您希望将输出表示为小时,因此工作表单元格中的公式类似于:

=elapsedWorkTime(C2;D2)*24

enter image description here

请注意5541的差异。在您的示例中,您显示的是经过时间的值8,52。但是在您的要求声明中,您只想包含工作时间。工作时间为18:00,因此不算在那之后花费的时间。

答案 1 :(得分:0)

也许不需要使用VBA。

  1. 使用NETWORKDAYS功能来计算日期之间的工作日。

  2. 将它们乘以每天的工作时间

  3. 减去从开始和结束日期开始的工作时间(例如,工作开始于工作日开始,等等)

  4. 计算总数。

我建议在单个单元格中执行所有步骤,以检查逐步的逻辑。