Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2014, 21:39   #1
VictorK
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 64
По умолчанию Подсчет количества одновременно совершаемых телефонных соединений

Здравствуйте, уважаемые форумчане!
Занимаюсь анализом телефонного трафика и, в частности, возникла задача оценить пропускную способность канала, а для этого нужно по существующим данным за прошлый период (трафик) рассчитать количество одновременно совершаемых вызовов, то есть всех предыдущих, которые на момент начала текущего соединения находятся в состоянии разговора. Использовал для этого формулу с функцией СУММПРОИЗВ(). Но поскольку рабочий трафик за месяц состоит более чем из 170 000 записей, эта формула получается очень ресурсоемкой - требует много памяти и мощного процессора. В прилагаемом файле небольшой фрагмент (2 дня) трафика и описание проблемы. Надеюсь, кто нибудь из "гуру Excel" предложит более рациональное решение.
Вложения
Тип файла: zip трафик.zip (39.9 Кб, 16 просмотров)
VictorK вне форума Ответить с цитированием
Старый 28.04.2014, 22:45   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Попробуйте формулу массива для 3-й строки
Код:
=СУММ(ЕСЛИ($A$2:A3=A3;ЕСЛИ(($B$2:B3+$C$2:C3/86400)>=B3;1))
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 28.04.2014, 22:59   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

А еще лучше ввести доп. столбец END с очевидной формулой и использовать СЧЕТЕСЛИМН (ст. E,F).
Вложения
Тип файла: zip трафик.zip (87.1 Кб, 16 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 28.04.2014, 23:06   #4
VictorK
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 64
По умолчанию

Спасибо. Формулу Вашу вставил, но при заполнении рабочего файла двойным кликом по правому нижнему углу ячейки Excel надолго завис.
Наверное, всё таки не стоит пытаться работать сразу с таким большим объёмом.
Попробую сделать сводную, определю по ней самый загруженный день и уже по этой дате проанализирую на максимум одновременных соединений.
Ещё раз спасибо.
О! Ещё одно решение! Сейчас гляну, только Excel пока "висит"...
System Explorer показывает, что Excel "съел" 7 Гигабайт оперативной памяти и 9 Гигабайт своп-файла

Последний раз редактировалось VictorK; 28.04.2014 в 23:14.
VictorK вне форума Ответить с цитированием
Старый 29.04.2014, 00:26   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Попробуйте макросом.
Но сперва добавить два допстолбца - можно это и макросом считать, но не хотелось время тратить

P.S. Много памяти есть не должно - трачу время на очистку отработанного времени... Хотя посмотрите - может где-то оно и будет висеть, хотя словарь в итоге почти пустой
Вложения
Тип файла: rar трафик.rar (54.1 Кб, 16 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 29.04.2014 в 00:28.
Hugo121 вне форума Ответить с цитированием
Старый 29.04.2014, 03:28   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

формула длиннее:
Код:
=ЕСЛИ(ПОИСКПОЗ(RC[-1];C[-2])-СТРОКА()<2;ПОИСКПОЗ(RC[-1];C[-2])-СТРОКА()+1;МАКС(МУМНОЖ(((RC[-2]:ИНДЕКС(C[-2];ПОИСКПОЗ(RC[-1];C[-2]))>=ТРАНСП(RC[-2]:ИНДЕКС(C[-2];ПОИСКПОЗ(RC[-1];C[-2]))))*(RC[-2]:ИНДЕКС(C[-2];ПОИСКПОЗ(RC[-1];C[-2]))<=ТРАНСП(RC[-1]:ИНДЕКС(C[-1];ПОИСКПОЗ(RC[-1];C[-2])))));СТРОКА(RC[-2]:ИНДЕКС(C[-2];ПОИСКПОЗ(RC[-1];C[-2])))^0)))
но считать должна намного быстрее, потому что не считает каждый раз всю таблицу с данными, а только необходимые ближайшие несколько строк
(на 800 строках данных это работает просто незаметно).
ну, и в данных дата и время начала и окончания звонка обьеденены в отдельные ячейки
Вложения
Тип файла: rar трафик.rar (95.2 Кб, 10 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 29.04.2014 в 10:35.
IgorGO вне форума Ответить с цитированием
Старый 29.04.2014, 10:25   #7
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Макрос, на приведенных данных отрабатывает менее чем за 20 мс.
Благодаря тому, что счет идет в целых числах (в секундах от начала массива).
Можно оформить как UDF и выводить массив q на лист.
Код:
Sub VictorK()
Dim v(), i&, j&, mx&, ub&, time0#, en&
v = Range("A2", Cells(Rows.Count, "C").End(xlUp)).Value
ub = UBound(v)
ReDim st(1 To ub) As Long, q(1 To ub) As Long
time0 = v(1, 1) + v(1, 2)
For i = 2 To ub
  st(i) = (v(i, 1) + v(i, 2) - time0) * 86400
Next
For i = 1 To ub
  en = st(i) + v(i, 3)
  For j = i + 1 To ub
    If st(j) <= en Then q(j) = q(j) + 1 Else Exit For
  Next
Next
mx = Application.Max(q) + 1
MsgBox "макс. число одновр. соед. " & mx
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 29.04.2014 в 10:28. Причина: косметические правки
Казанский вне форума Ответить с цитированием
Старый 29.04.2014, 15:14   #8
VictorK
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 64
По умолчанию

Всем большое спасибо, буду пробовать по очереди.
Вариант с макросом от Hugo121 задумался на полтора часа, пришлось убивать процесс Excel. Действительно, считать весь вышележащий массив данных до конца месяца (десятки тысяч строк) не имеет смысла. На практике очень редко попадаются соединения продолжительностью более 3 часов.
VictorK вне форума Ответить с цитированием
Старый 29.04.2014, 15:42   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Полтора часа? А внизу в статусбаре время тикало? Там каждая сотая строка пишется.
Но уже есть мнгновенный вариант Казанского
Как оно работает - я пока не дотумкал, времени изучить нет

А мой вариант и не считает весь вышележащий массив. Вернее посчитал и забыл, запомнил только максимум. Но всё равно небыстро...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 29.04.2014 в 15:44.
Hugo121 вне форума Ответить с цитированием
Старый 29.04.2014, 17:03   #10
VictorK
Пользователь
 
Регистрация: 24.05.2008
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Полтора часа? А внизу в статусбаре время тикало? Там каждая сотая строка пишется.
В Windows 7 подвисшее приложение при обращении к нему не отвечает и "мутнеет", в заголовке окна выводится надпись - "приложение не отвечает". В это время никаких признаков работы макроса не наблюдалось, можно было подождать ещё, но решил просто прервать процесс.
Сейчас пробую применить простую формулу СЧЁТЕСЛИ() к двум дополнительным столбцам с объединенными датой/временем, но, похоже, опять Excel повисла...
VictorK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос изменения количества строк в таблицах на двух листах книги одновременно timda81 Microsoft Office Excel 5 30.06.2012 19:58
[QT] подсчет количества символов Unknown Lady Помощь студентам 0 24.11.2011 15:06
подсчет количества дней ГОСЕАН Помощь студентам 26 31.10.2011 07:30
Подсчет количества записей ShnapS БД в Delphi 2 11.10.2011 16:31
Подсчет ячеек одновременно по цвету и значению bud-dy Microsoft Office Excel 7 17.03.2011 14:43