2015-09-09 4 views
0

У меня есть две колонки даты/времени (ей) и вам нужно выяснить, сколько из них перекрывается в определенное время.Число перекрывающихся дат (ы)

Use case is this: Это время начала и окончания телефонных звонков, и я ищу, чтобы найти количество одновременных звонков.

Column A   Column B  
8/06/15 00:17:59 8/06/15 00:19:21  
8/09/15 00:21:06 8/09/15 00:22:06  
8/09/15 00:21:21 8/09/15 00:22:43  
8/09/15 00:22:11 8/09/15 00:22:46  
8/10/15 00:24:28 8/10/15 00:24:51  

Ожидаемый результат:

Column A   Column B    Number Overlap  
8/06/15 00:17:59 8/06/15 00:19:21  0 
8/09/15 00:21:06 8/09/15 00:22:06  1 
8/09/15 00:21:21 8/09/15 00:22:43  2 
8/09/15 00:22:11 8/09/15 00:22:46  1 
8/10/15 00:24:28 8/10/15 00:24:51  0 

Формула Я пытаюсь это:

=SUMPRODUCT((A$2:A$35006<=B2)*(B$2:B$35006>=A2)) 

Я хотел бы также ссылаться на подобные вопросы, которые не совсем ответить на то, что мне нужно здесь , но помогли мне забраться так далеко:

Find number of concurrent, overlapping, date ranges

http://www.mrexcel.com/forum/excel-questions/388376-count-number-date-ranges-overlap-other-date-ranges.html

+0

Вы должны искать те, которые имеют полное перекрытие? Так они начинают, прежде чем другой и в конце после того. – MatthewD

+0

да. Все, что перекрывается. В принципе, как многие из них происходят в одно и то же время. – ajspacemanspiff

+0

Ответ обновлен, чтобы поймать полные совпадения. – MatthewD

ответ

0

Я думаю, вам просто нужно вычесть одну из текущей формулы:

=SUMPRODUCT((A$2:A$35006<=B2)*(B$2:B$35006>=A2))-1 
+0

Я не могу заставить его работать, но все результаты возвращаются как 0. – ajspacemanspiff

+0

Он работает здесь. Предполагается, что ваши номера телефонов начинаются в строке 2 и спуститесь оттуда до строки 35006. Вы должны убедиться, что ни одна из записей не является фактически ТЕКСТом, а не истинными. –

+0

Если вам нравится, я могу помочь. Просто отправьте мне файл, и я буду иметь он быстро сортировался. адрес электронной почты: [email protected] –

0

Поскольку у вас есть VBA в вас теги, вот как вы можете это сделать.

В VBA IDE перейдите в меню инструментов и выберите ссылки. Выберите «объекты данных Microstoft ActiveX 2.8 Library.

Private Sub CheckOverlaps() 
    Dim ws1 As Excel.Worksheet 
    Dim iCount As Integer 
    Dim rs As New ADODB.Recordset 
    Dim lRow As Long 

    'Set the worksheet that you want to process by name 
    Set ws1 = ActiveWorkbook.Sheets("Sheet1") 

    'Add fields to your recordset for storing data. 
    With rs 
     .Fields.Append "Row", adInteger 
     .Fields.Append "Start", adDate 
     .Fields.Append "End", adDate 
     .Open 
    End With 

    lRow = 1 

    ws1.Activate 
    'Loop through and record what is in the columns 
    Do While lRow <= ws1.UsedRange.Rows.count 

     If ws1.Range("A" & lRow).Value <> "" Then 
      rs.AddNew 
      rs.Fields("Row").Value = lRow 
      rs.Fields("Start").Value = ws1.Range("A" & lRow).Value 
      rs.Fields("End").Value = ws1.Range("B" & lRow).Value 
      rs.Update 
     End If 

     lRow = lRow + 1 
     ws1.Range("A" & lRow).Activate 
    Loop 

    lRow = 1 

    'Loop through and check for overlaps in the records. 
    Do While lRow <= ws1.UsedRange.Rows.count 

     iCount = 0 

     If ws1.Range("A" & lRow).Value <> "" And ws1.Range("A" & lRow).Value <> "" Then 

      'Check for those that started in the timespan 
      rs.Filter = "" 
      rs.Filter = "Start >= '" & ws1.Range("A" & lRow).Value & "' AND Start <='" & ws1.Range("B" & lRow).Value & "'" 
      iCount = rs.RecordCount 

      'Check for those that ended in the timespan 
      rs.Filter = "" 
      rs.Filter = "End >= '" & ws1.Range("A" & lRow).Value & "' AND End <='" & ws1.Range("B" & lRow).Value & "'" 
      iCount = iCount + rs.RecordCount 

      'Check for those that started before and ended after the current timespan. 
      rs.Filter = "" 
      rs.Filter = "Start <= '" & ws1.Range("A" & lRow).Value & "' AND End >='" & ws1.Range("B" & lRow).Value & "'" 
      iCount = iCount + rs.RecordCount 

      'Report the number. You minus three because the records that are the time will get counted each time 
      ws1.Range("c" & lRow).Value = iCount - 3 
     End If 

     lRow = lRow + 1 
    Loop 

End Sub 
Смежные вопросы