【问题标题】:Total Overlapping Time总重叠时间
【发布时间】:2017-09-29 16:49:39
【问题描述】:

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

    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 的了解不够,无法适应我的目的。非常感谢任何帮助!

【问题讨论】:

    标签: excel vba time overlap


    【解决方案1】:

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

    我可以通过两种方式来表示您的数据,而您尚未指定哪种方式,因此我将为每种方式提供一个解决方案。

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

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

    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 列检查该行和下一行是否为同一代理,如果是,则获取时间差。

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

    【讨论】:

    • 这很好用!我只需要稍微格式化我的数据就可以让它工作了。我们使用的程序在创建报告之前将所有数据格式化为文本。我只需要将时间戳写入同一个单元格,让 Excel 将它们自动格式化为 DateTime。
    • 如果这对你有用,如果你接受它作为你的答案,我将不胜感激:)
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多