【问题标题】:Checking if TIME passes through a specific time RANGE检查 TIME 是否经过特定时间范围
【发布时间】:2021-07-07 02:36:35
【问题描述】:

我有一个指定的范围:12:00pm 到 12:30pm

如果这些时间在指定范围内,我想在现有分配的时间上增加半小时。

例如,如果任务是从上午 10:00 到下午 1:00 执行的,我想在任务结束时添加 30 分钟,这样任务的结束时间就是下午 1:30

关于如何解决这个问题的任何建议?

编辑 1:

我已经摆弄了几个代码,这是我到目前为止想出的:

Public Function GetAdjEndTime(StartDateTime As Date, EndDateTime As Date) As Date
    Dim StartDate As Date, EndDate As Date, StartTime As Date, EndTime As Date
    StartDate = Application.WorksheetFunction.RoundDown(StartDateTime, 0)
    StartTime = StartDateTime - StartDate
    EndDate = Application.WorksheetFunction.RoundDown(EndDateTime, 0)
    EndTime = EndDateTime - EndDate
    
    If StartTime <= #12:00:00 PM# And EndTime >= #12:30:00 PM# Then
        GetAdjEndTime = EndDate + EndTime + (1 / 48)
    Else
        GetAdjEndTime = EndDate + EndTime
    End If

End Function

您如何考虑边缘情况,例如开始/结束日期不同时会发生什么,确切地从 12:00 开始的任务会发生什么,当工作在 12:15 完成时会发生什么等?

【问题讨论】:

标签: excel vba for-loop if-statement conditional-statements


【解决方案1】:

这需要比您提供的更多的设置。但是如果你使用我在这个公式下面的设置,就可以完成这项工作。

=B6+C6+IF(AND(B6<=D$3,(B6+ C6)>C$3),(D$3-C$3),0)

编辑

使用 VBA 也是如此。您需要确保将真实的日期/时间值作为参数提供。

Public Function AdjustedEndTime(ByVal StartDateTime As Date, _
                                ByVal EndDateTime As Date) As Date
    ' 219

    Dim Fun         As Double           ' function return value
    Dim BreakStart  As Double
    Dim BreakTime   As Double
    Dim BreakEnd    As Double
    Dim StartTime   As Double
    
    BreakStart = TimeValue("12:00")
    BreakTime = TimeValue("00:30")
    BreakEnd = BreakStart + BreakTime
    StartTime = CDbl(StartDateTime) - Int(StartDateTime)
    
    ' StartTime can't be within 3 minutes from lunch break
    If (BreakStart - StartTime) < TimeValue("00:03") Then
        EndDateTime = EndDateTime + BreakEnd - StartTime
        StartTime = BreakEnd
    End If
    
    ' add one lunch break per day
    Fun = EndDateTime + CInt(EndDateTime - StartDateTime)
    Fun = Fun + (Abs(StartTime < BreakEnd) * BreakTime)
    
    AdjustedEndTime = CDate(Fun)
End Function

以下是我用于测试的过程。您可能会发现它对相同的目的很有用。

Private Sub Test()
    Dim Dte         As Date
    Dim Duration    As Date
    
    Dte = #3/13/2021 10:15:00 AM#
    Duration = TimeValue("2:00")
    Debug.Print AdjustedEndTime(Dte, Dte + Duration)
End Sub

【讨论】:

  • 此设置与我的设置非常相似,但是您如何将其放入 VBA 中?
  • 如你所见,我已经放弃了 EndTime,因为它是未知的,用 Duration 代替它。您打算如何指定 StartTime,尤其是日期(如果有)?您打算如何在 VBA 中指定 Duration ?这将是一个 UDF,并且这些值是从工作表中获取的吗?
  • 我让它自动执行任务,查看它的持续时间并计算结束时间,但这并不准确,因为它错过了午休时间的额外 30 分钟。
  • 您的 VBA 从哪里获得 StartTimeEndTime(或持续时间)?你如何将这些值传递给你的函数?您的代码说它们是“日期”。约会没有时间。如何确切地定义这些值?
  • 原始代码更繁琐,更复杂的是它如何获取值以及如何组织它,它如何获取事物的输入等等,这是我从我的代码中唯一使用的东西发布在问题中的是 if 语句。如果您愿意,我可以发布它,但要解释它的每个部分需要很长时间。
猜你喜欢
  • 2016-10-23
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多