所以我有关于excel中重叠时间范围的问题,我不确定如何攻击代码。
目前,如下所示,我的excel表有不同的时间表示整个商店中某些流程的开始和结束。这些过程可能有几个小时的开始和结束时间,也可能只有几分钟。我想要做的是找出这些过程是在第一班还是第二班,即上午6:00到下午4:30或下午4:30到3:00之间。
显然,上面的时间都会落在第一班,但我希望能够确切地知道每个班次有多少过程,即代码会输出上面的第一个和第二个过程都是在第一班上花了33分钟。
我理解并且我不是试图将我的问题外包给别人代码。我想我还在询问使用Intersect函数解决这个特定问题的有效性。我知道该函数可用于查找单元格范围的交集,即Intersect(Activecell, Range("A1:A10"))
,它将输出交叉单元格的数量,但我想知道交叉函数是否可用于查找重叠时间范围,如上所述
我尝试过在每个单元格中放置代码的复杂路径来计算long if语句,例如。 =IF(AND(B6<F18,B5>E18), B6-B5, 0)
其中B5和B6如上所示,E18和F18是第一班的开始和结束,但这仍然过于简单化,这只是编码过程完全进入第一班的情况。编码过程长度潜力之间重叠和变化的每种可能性将是一场噩梦。
这是我希望的地方,Intersect会有所帮助,虽然我不完全理解其潜力的含义,也不是甚至是帮助我解决问题的正确功能。
希望这更准确。感谢。
答案 0 :(得分:0)
尝试这样的事情:
Public Function getShiftMinutes(ByVal pStart As Date, ByVal pEnd As Date, ByVal pShift As Integer) As Long
Dim dteShiftStart As Date
Dim dteShiftEnd As Date
' determine shift start and end
If pShift = 1 Then
dteShiftStart = TimeSerial(6, 0, 0)
dteShiftEnd = TimeSerial(16, 30, 0)
Else
dteShiftStart = TimeSerial(16, 30, 0)
dteShiftEnd = TimeSerial(3, 0, 0)
dteShiftEnd = DateAdd("d", 1, dteShiftEnd)
End If
' adjust late hours
If pStart <= TimeSerial(3, 0, 0) Then
pStart = DateAdd("d", 1, pStart)
End If
If pEnd <= TimeSerial(3, 0, 0) Then
pEnd = DateAdd("d", 1, pEnd)
End If
' determin if either start or end was in the shift
If (pStart >= dteShiftStart And pStart <= dteShiftEnd) Or (pEnd >= dteShiftStart And pEnd <= dteShiftEnd) Then
' adjust start and end if requiered
If pStart < dteShiftStart Then
pStart = dteShiftStart
End If
If pEnd > dteShiftEnd Then
pEnd = dteShiftEnd
End If
getShiftMinutes = DateDiff("n", pStart, pEnd)
Else
getShiftMinutes = 0
End If
End Function
第一个参数采用开始时间,第二个参数采用结束时间,第三个参数采用班次编号
您可以通过以下方式进行测试:
Private Sub test()
Debug.Print getShiftMinutes(TimeSerial(1, 0, 0), TimeSerial(1, 33, 0), 2)
End Sub
并在您的工作表中:
=getShiftMinutes(A5;A6;1)
答案 1 :(得分:0)
我根据一周中的几天将输入从简单的时间改为日期和时间。因此,我略微更改了上面的代码,以便选出可触发第一和第二班的特定工作日。我还添加了一个Sub()循环来自动填充代码末尾的电子表格。 Cell.Offset()
代码仅指上述B5
和B6
单元格。
现在,我所面临的问题围绕着调整开始时间和结束时间,如果过程在班次之前开始或在班次之后结束。由于TimeSerial(6, 0, 0)
指的是1/1/1900日期而不是正确的原始数据日期,因此计算极不正确。是否有一种简单的方法可以格式化代码,以便从pStart
和dteShiftStart
的{{1}}数据中提取日期?
dteShiftEnd
答案 2 :(得分:0)
尝试这样的事情
Sub test()
Dim firstFrom As Date, firstTill As Date, secondFrom As Date, secondTill As Date
firstFrom = #10:00:00 AM#
firstTill = #3:53:00 PM#
secondFrom = #10:33:00 AM#
secondTill = #11:06:00 PM#
firstMed = Application.WorksheetFunction.Median(firstFrom, firstTill + 1, secondTill + 1)
secondMed = Application.WorksheetFunction.Median(firstFrom, firstTill + 1, secondFrom)
countMins = firstMed - secondMed
MinFormated = Format(countMins, "hh:mm")
HourToMinInt = Int(Split(MinFormated, ":")(0)) * 60
MinInt = HourToMinInt + Int(Split(MinFormated, ":")(1))
End Sub