总重叠时间

我为一家运行在线客服聊天的公司工作。 每个员工可以一次接受两个聊天。 我需要找出每位员工每天花在“双人聊天”上的总时间。 我打算通过为每个聊天添加重叠时间来做到这一点。 但是,由于多个聊天可以同时发生,并且聊天可以运行的时间长短没有限制,所以单个聊天可能会重叠几个较短的聊天。 那是我遇到麻烦的地方。 我发现这个代码发现重叠小时:

Sub intersectHours() Dim a As Long, i As Long, j As Long, rng As Range, ohrs As Double With Worksheets("Sheet1") For i = 2 To .Cells(Rows.Count, "E").End(xlUp).Row ohrs = 0: Set rng = Nothing For j = 2 To .Cells(Rows.Count, "E").End(xlUp).Row If j <> i And Not Intersect(.Range(Hour(.Cells(i, "D").Value2) & ":" & Hour(.Cells(i, "E").Value2) - 1), _ .Range(Hour(.Cells(j, "D").Value2) & ":" & Hour(.Cells(j, "E").Value2) - 1)) Is Nothing Then If rng Is Nothing Then Set rng = Intersect(.Range(Hour(.Cells(i, "D").Value2) & ":" & Hour(.Cells(i, "E").Value2) - 1), _ .Range(Hour(.Cells(j, "D").Value2) & ":" & Hour(.Cells(j, "E").Value2) - 1)) Else Set rng = Union(rng, Intersect(.Range(Hour(.Cells(i, "D").Value2) & ":" & Hour(.Cells(i, "E").Value2) - 1), _ .Range(Hour(.Cells(j, "D").Value2) & ":" & Hour(.Cells(j, "E").Value2) - 1))) End If End If Next j If Not rng Is Nothing Then For a = 1 To rng.Areas.Count ohrs = ohrs + TimeSerial(rng.Areas(a).Rows.Count, 0, 0) Next a End If '.Cells(i, 6).NumberFormat = "[h]:mm:ss" .Cells(i, 6) = ohrs Next i End With End Sub 

但是,我的数据是h:mm:ss格式,所以重叠的时间输出应该是相同的。 上面的代码只输出几个小时,我不知道VBA是否适合我的目的。 任何帮助深表感谢!

我自己在WFM工作,我也必须考虑并发。 我已经为这种情况build立了报告。 但是,我主要使用Excel公式和数据透视表来表示从VBA稍微处理后的数据

有两种方式我可以考虑你的数据被表示,而你没有指定哪一个,所以我会提供一个解决scheme。

数据以每行的开始和停止时间存储。

假设每行是A代理ID,B是聊天ID,C是开始,D是停止。 您将要将其转换为事件types报告。 以下代码通过将停止事件添加到数据底部并将现有数据转换为开始时间事件来完成此操作。

 Dim h As Long: h = ActiveSheet.UsedRange.Rows.Count Range("A" & h + 1 & ":B" & h + h - 1).Value = Range("A2:B" & h).Value Range("C" & h + 1 & ":C" & h + h - 1).Value = Range("D2:D" & h).Value Range("D2:D" & h).Value = 1 Range("D" & h + 1 & ":D" & h + h - 1).Value = -1 Range("C1").Value = "Timestamp" Range("D1").Value = "Type" 

数据存储为基于事件。

如果我假设列A是代理ID,B是聊天ID,C是时间戳,D是开始/停止。 按照代理ID(A)升序排列,然后按时间戳(C)升序,然后添加公式。 代码如下:

 Dim h As Long: h = ActiveSheet.UsedRange.Rows.Count ActiveSheet.UsedRange.AutoFilter With ActiveSheet.AutoFilter.Sort .SortFields.Clear .SortFields.Add _ Key:=Range("A2:A" & h), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .SortFields.Add _ Key:=Range("C2:C" & h), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("E1").Value = "Concurrency" Range("E2:E" & h).FormulaR1C1 = "=RC4+IF(RC1=R[-1]C1,R[-1]C5)" Range("F1").Value = "isConcurrent" Range("F2:F" & h).FormulaR1C1 = "=RC5>0" Range("G1").Value = "Duration" Range("G2:G" & h).FormulaR1C1 = "=IF(R[1]C1=RC1,R[1]C3-RC3,0)" 

列E获得当前正在进行的聊天的数量,当新的聊天开始时增加一个,并且当一个结束时减去。 列F检查是否至less有一个聊天正在进行中。 列G检查该行和下一行是否是相同的代理,如果是,获取时间差。

一旦完成了这一切,就要调整结果。 现在,您可以表示每个代理程序的持续时间和并发级别(EX:1聊天vs 2聊天)以及代理程序和组总数。 再一次,我自己做这个完全一样的任务,这就是我做这件事的方式。