Excel Macro VBA:在总数可以超过24小时的情况下加入数分钟和小时



希望这是一个愚蠢的问题,有一个简单的答案。

我别无选择

我基本上正在计算一个月内的总停机时间。我需要一起添加少量分钟,以找出当然超过24小时的总数。

这是场景:

服务器A在本月下降了3小时52分钟。
服务器B本月停止了15小时25分钟。

服务器B在关键时期内有7小时23分钟的停机时间,因此将其与3等等同于非关键停机时间。

服务器A有:3小时52分钟x1
服务器B有:8小时2分钟x1
服务器B有:x3

的7小时21分钟

所有的下降时间和修复时间均以Excel认可的时间格式手动列出,例如:

事件1:19/11/2017 5:00:19/11/2017 14:12
事件2:13/11/2017 6:00:13/11/2017 6:40
事件3:13/11/2017 7:57:13/11/2017 9:01
事件4:17/11/2017 6:15:18/11/2017 8:10

周末不计数

在凌晨6点至下午6点之间仅分钟

在特定时间段内的优先级增加:

06:00-07:00,07:00-09:00,09:00-10:00,10:00-14:00

高优先级分钟乘以等同于较低的标准时间使用

等同

我正在努力寻找一种将时间添加到数小时的方法,Excel Trys提供相对于01/01/1900或一些"真实"日期的答案。

我走相反的方式,我有真正的日期,我需要与他们之间的小时数一起工作。是否存在平原时间的数据格式:分钟?

我认为这很明显,但是如果开始的时间和结束时间不一定在同一天,我会清楚地说。它们可以在任何时候,任何关系,有时开始的时间是 由于如何报告故障而导致的结束时间。显然,在这种情况下,这是0分钟。


我目前攻击此问题的方法是:

  1. 增加开始时间,直到它成为有效的充电时间
  2. 计算分钟直到发生变化,例如一天结束或更高的优先级时间插槽,或者开始时间=结束时间
  3. 将计算的分钟添加到总计
  4. 将开始时间增加计算的分钟
  5. 从新的"开始时间"开始再次开始周期,然后循环到开始时间和结束时间之间剩下的分钟

    startof:
    'move to start of next chargeable day, if not on a chargeable day
    'eg weekends, public holidays, easy function to write
    Do While testForChargeable() = False
        opnDate = DateAdd("d", 1, opnDate)
        opnTime = "06:00"
    Loop
    'check if open time is past the end of chargeable time, 18:00
    If (opnTime >= endofdayTime) Then
        'move to start of next chargeable day
        opnDate = DateAdd("d", 1, opnDate)
        opnTime = "06:00"
    End If
    'check if open time is after close time and fault is excluded
    If (opnDate >= bisDate) And (opnTime >= bisTime) Then
        GoTo last
    End If
    'check if close time is on same day as start time
    If DateDiff("d", opnDate, bisDate) = 0 Then
        'if it is, add minutes between opntime and bistime
        chargeTime = chargeTime + calculateChargeTime(opnTime, bisTime)
        'calculation ends, loop naturally terminates
    Else
        'if not, add remaining mintes of day to chargeable time
        chargeTime = chargeTime + calculateChargeTime(opnTime, endofdayTime)
        'move to start of next day
        opnDate = DateAdd("d", 1, opnDate)
        opnTime = "06:00"
        GoTo startof
    End If
    last:
    

欢呼

edit: 现在我们在同一页面上,我认为我认为是一个可行的解决方案,我ll替换我以前的答案[re:Excel日期如何与值相关(即1天= 1)]。上一个答案(在尝试发布时,我的计算机混乱了)在编辑历史记录中是可见的。


因此,您需要一种计数分钟持续时间(两个数据列表之间)的方法,并根据可能需要进行进行进行调整的标准包括或排除子范围,并且您希望在VBA功能中使用此功能以用于自动化停机时间数据分析。

尝试以下方法:

Option Explicit
Function MinsBetween(startDateTime As Date, stopDateTime As Date, count_StartTime As Date, count_StopTime As Date) As Long
    Dim startTime As Date, stopTime As Date 
    'ignore dates, use only the times
    startTime = startDateTime - Int(startDateTime)
    stopTime = stopDateTime - Int(stopDateTime)
    If startTime >= count_StopTime Or stopTime <= count_StartTime Then
        'entire period falls outside of times to count
        MinsBetween = 0
        Exit Function
    End If
    'make 'adj' times start/end at counted times if necessary
    startDateTime = IIf(startTime < count_StartTime, count_StartTime, startTime)
    stopDateTime = IIf(stopTime > count_StopTime, count_StopTime, stopTime)
    'calculate & return minutes between (never return negative number)
    MinsBetween = Abs(DateDiff("n", startDateTime, stopDateTime))
End Function

此功能仅计数startDateTimestopDateTime之间的分钟,该分钟也介于count_StartTimecount_StopTime之间。

期望: -count_StartTime&amp;count_StopTime是一个excel时间(或0到1之间的数字) -startDateTime&amp;stopDateTime是Excel Time dateTime。

返回一个长整数。可以在VBA或工作表函数中引用。

示例用法:

停电"事件"发生在2017/11/11的05:00到07:03,但只能计算凌晨6点至下午6点之间的时间:

Debug.Print MinsBetween("2017/11/19 05:00", "2017/11/19 07:03", "06:00", "18:00") 

停电"事件"发生在2017/11/19的05:00到14:12。[峰值时间]下午1点至下午2点之间发生的持续时间具有较高的优先级,应将其计为" double-time ":

Debug.Print (2 * MinsBetween("2017/11/19 05:00", "2017/11/19 14:12", "13:00", "15:00") )

由于周末完全忽略了,这些报告可能会被类似的简单检查排除在外:

Function isWeekend(wDateTime As Date) As Boolean
    isWeekend = Weekday(DateValue(wDateTime)) = vbSaturday Or Weekday(DateValue(wDateTime)) = vbSunday
End Function

...如果提供的日期(或DateTime)落在周末,则返回TRUE,否则返回false。


您可以使用这些功能的组合来围绕您的自定义标准构建子或工作表功能,并根据需要进行调整。

例如:

Function DownTimeMinutes(startDateTime As Date, stopDateTime As Date) As Long
'you could process your custom criteria for each start/stop period here
    Dim dtMinutes As Long
    'for example:
    'IGNORE DOWNTIME ON WEEKENDS
    If isWeekend(startDateTime) Then
        'ignore weekeends
        DownTimeMinutes = 0
        Exit Function
    End If
    'COUNT MINUTES BETWEEN 6AM-6PM with "x1" multiplier
    dtMinutes = MinsBetween(startDateTime, stopDateTime, "06:00", "18:00")
    'DON'T COUNT LUNCH BREAK (or something like that)
    '(subtract these minutes from total)
    dtMinutes = dtMinutes - MinsBetween(startDateTime, stopDateTime, "12:00", "12:30")
    'COUNT MINUTES BETWEEN 14:00-15:00 as "x3"
    '(already counted as "x1" so add "2x these minutes"
    dtMinutes = dtMinutes + (2 * MinsBetween(startDateTime, stopDateTime, "14:00", "15:00"))
    'return adjusted minutes for this downtime event
    DownTimeMinutes = dtMinutes
End Function

旁注:,这是我认为部分问题的一部分是我所遇到的长期示例的短篇小说,这是您在变化不同的m/d/y,mm/dd/dd/yy上的麻烦。,M-dd-yyy等,无论用户的区域日期设置如何

据我了解,您现在不需要它,但我认为我最好还是将其添加到我的答案中:

=DATE(MID(RIGHT(LEFT(A1,FIND(" ",A1)-1),LEN(LEFT(A1,FIND(" ",A1)-1))-FIND("/",LEFT(A1,FIND(" ",A1)))),FIND("/",RIGHT(LEFT(A1,FIND(" ",A1)-1),LEN(LEFT(A1,FIND(" ",A1)-1))-FIND("/",LEFT(A1,FIND(" ",A1)))))+1,4),LEFT(RIGHT(LEFT(A1,FIND(" ",A1)-1),LEN(LEFT(A1,FIND(" ",A1)-1))-FIND("/",LEFT(A1,FIND(" ",A1)))),FIND("/",RIGHT(LEFT(A1,FIND(" ",A1)-1),LEN(LEFT(A1,FIND(" ",A1)-1))-FIND("/",LEFT(A1,FIND(" ",A1)))))-1),FIND("/",RIGHT(LEFT(A1,FIND(" ",A1)-1),LEN(LEFT(A1,FIND(" ",A1)-1))-FIND("/",LEFT(A1,FIND(" ",A1))))))+TIMEVALUE(RIGHT(A1,LEN(A1)-FIND(" ",A1)))

通常,我不容忍使用巨大公式(我更关心将其纳入有关可读性的单个功能),并且还有其他方法可以处理由共享工作簿中区域差异引起的日期问题(包括Windows API),但在大多数情况下,我发现文本操纵也可以完成工作。

相关内容

最新更新