能否请您帮我获取两个日期之间的差额(仅工作时间,这很重要)
看看这张图片:
首次答复是通过以下方式计算的:日期首次答复和问题日期
已用时间是通过以下方式计算的:上次响应日期和问题日期
到目前为止,这是我的宏(无法正常工作):
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
答案 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
请注意5541
的差异。在您的示例中,您显示的是经过时间的值8,52
。但是在您的要求声明中,您只想包含工作时间。工作时间为18:00
,因此不算在那之后花费的时间。
答案 1 :(得分:0)
也许不需要使用VBA。
使用NETWORKDAYS功能来计算日期之间的工作日。
将它们乘以每天的工作时间
减去从开始和结束日期开始的工作时间(例如,工作开始于工作日开始,等等)
计算总数。
我建议在单个单元格中执行所有步骤,以检查逐步的逻辑。