总重叠时间

Total Overlapping Time

我在一家提供在线客服聊天的公司工作运行。每个员工一次最多可以进行两次聊天。我需要找出每位员工每天在 'double chats' 中花费的总时间。我打算通过将每次聊天的重叠时间相加来做到这一点。但是,由于可以同时进行多个聊天,并且聊天的时间长短没有限制 运行,因此一个长聊天可能会被几个较短的聊天重叠。这就是我 运行 遇到麻烦的地方。我发现这段代码可以找到重叠时间:

    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 工作,我也必须考虑并发性。我已经为这种情况建立了报告。但是,我主要使用 excel 公式和枢轴 table 来表示 VBA

稍加处理后的数据

我认为您的数据有两种表示方式,您没有具体说明是哪一种,所以我将为每种方式提供一个解决方案。

数据每行存储开始和结束时间。

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

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 是 Start/Stop。按代理 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 列检查是否至少有一个聊天正在进行。 G 列检查该行和下一行是否是同一代理,如果是,则获取时间差。

一切都完成后,旋转结果。现在,您可以表示每个代理的持续时间和并发级别(例如:1 次聊天与 2 次聊天)以及代理和组总数。同样,我自己完成了完全相同的任务,这就是我做的方式。