总重叠时间

时间:2017-09-29 16:49:39

标签: excel vba time overlap

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

    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的了解不足以使其适应我的目的。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我自己在WFM工作,我也要考虑并发性。我已经为这种情况建立了报告。但是,我主要使用excel公式和数据透视表来表示从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是开始/停止。按代理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列检查该行和下一行是否是同一个代理,如果是,则获取时间差。

一旦完成,转动结果。现在,您可以表示每个代理的持续时间和并发级别(EX:1聊天与2个聊天)以及代理和组总计。再一次,我自己完成了同样的任务,这就是我这样做的方式。