excel - 试图获得 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
编辑#1:我应该从周一到周五获得工作时间(不包括周末,但我不知道该怎么做)
编辑#2:差异应以小时显示
编辑#3:之前,我正在使用这个宏(一切正常,但我没有得到工作时间)
Public cVal
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim LastRow
LastRow = Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To LastRow
t1 = TimeValue(CStr(Cells(i, "D").Value))
t2 = TimeValue(CStr(Cells(i, "E").Value))
t3 = TimeValue(CStr(Cells(i, "F").Value))
'input First Response time
If Hour(t2) - Hour(t1) = 0 Then
Cells(i, "G").Value = Round((Minute(t2) - Minute(t1)) / 60, 2)
Else
Cells(i, "G").Value = Hour(t2) - Hour(t1) + Round((Minute(t2) - Minute(t1)) / 60, 2)
End If
'input Elapsed Time
If Hour(t3) - Hour(t1) = 0 Then
Cells(i, "H").Value = Round((Minute(t3) - Minute(t1)) / 60, 2) '- Cells(i, "J").Value - Cells(i, "J").Value
Else
Cells(i, "H").Value = Hour(t3) - Hour(t1) + Round((Minute(t3) - Minute(t1)) / 60, 2) '- Cells(i, "J").Value
End If
Next i
Target.Offset(1).Select
End Sub
解决方案
我写了一个函数,它应该只计算周一至周五的工作时间。
请注意,在您发布的示例中,某些日期是周六/周日,因此将计算为零。
算法:
- 将周一至周五的每一天的工作时间计算为
WORKING_DAY_START -
WORKING_DAY_END` 小时。 - 如果这一天恰好是计算的第一天或最后一天,请进行调整。
您可以在工作表本身上使用此函数,也可以从仅使用值填充单元格的宏中调用 if。
下面我将展示你的原始数据,以及一些改变你周末工作日期的额外行。
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
因此在此之后花费的时间不应计算在内。
推荐阅读
- spring - 将层从多层架构中解耦为微服务
- migration - 将 PowerBuilder 应用程序构建过程迁移到 TeamCity
- java - 递归二分搜索不返回预期值
- angular - 从 Karma 切换到 Jest 时单元测试停止工作
- java - 从另一个窗口对一个窗口的元素执行 JavaFX 操作
- javascript - aframe-physics-system.js:5508 Uncaught TypeError: Cannot read property 'x' of undefined
- android - 转到另一个页面后删除欢迎页面
- azure-devops - Artifact feed azure devops.Not sure how it meant to work
- angular - Angular Material Tree nested node depth
- unit-testing - 具有良好测试的 TYPO3 扩展