Импортирую данные в эксель по DDE со сторонней программы. Импортирование идет динамически, то есть постоянно добавляются новые строки. Количество строк за день достигает 100 000. Данные строки я суммирую при совпадении трех условий (в приложении пример ). Сложность в том, что если запустить 24 таких формул, то загрузка процессора приближается к 100% и начинаются жуткие тормоза. Запуск такого количества формул необходим, чтобы просуммировать данные за временной диапазон 1 час.
Какую альтернативу данной формуле можно использовать? Или как-то отключить работу формулы после выхода её из временнго диапазона суммирования. То есть закончился час, отключается её работа и включается новая формула, соответствующая следующему часу.
Добрый день! Прошу помощи у специалистов.
Импортирую данные в эксель по DDE со сторонней программы. Импортирование идет динамически, то есть постоянно добавляются новые строки. Количество строк за день достигает 100 000. Данные строки я суммирую при совпадении трех условий (в приложении пример ). Сложность в том, что если запустить 24 таких формул, то загрузка процессора приближается к 100% и начинаются жуткие тормоза. Запуск такого количества формул необходим, чтобы просуммировать данные за временной диапазон 1 час.
Какую альтернативу данной формуле можно использовать? Или как-то отключить работу формулы после выхода её из временнго диапазона суммирования. То есть закончился час, отключается её работа и включается новая формула, соответствующая следующему часу.Denis_
Функция ТДАТА() возвращает текущую дату и время, функция ТЕКСТ приводит полученное значение к формату "чч", т.е. возвращает текущий час. Ну и "+1" это, чтобы получить следующий час.
Функция ТДАТА() возвращает текущую дату и время, функция ТЕКСТ приводит полученное значение к формату "чч", т.е. возвращает текущий час. Ну и "+1" это, чтобы получить следующий час.Manyasha
ЯД: 410013299366744 WM: R193491431804
Сообщение отредактировал Manyasha - Пятница, 03.04.2015, 16:54
Denis_, если нужно сохранять значения за предыдущие часы, предлагаю макросом вычислять текущее время и переписывать соответствующее , значение. Кода пока нет, чуть позже выложу, если меня никто не опередит)
Denis_, если нужно сохранять значения за предыдущие часы, предлагаю макросом вычислять текущее время и переписывать соответствующее , значение. Кода пока нет, чуть позже выложу, если меня никто не опередит)Manyasha
Может я ошибаюсь, но почему от таких формул сократится время работы процессора? Всегда пересчитывается весь столбец. Скажите в единицу времени по сколько строк добавляется, по одной или сразу много?
Может я ошибаюсь, но почему от таких формул сократится время работы процессора? Всегда пересчитывается весь столбец. Скажите в единицу времени по сколько строк добавляется, по одной или сразу много?AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
AlexM, я так понимаю, что в исходном варианте Denis_ использует 24 формулы, по одной для каждого часа, если вместо этих 24-х формул будет одна, время подсчета не сократится?
AlexM, я так понимаю, что в исходном варианте Denis_ использует 24 формулы, по одной для каждого часа, если вместо этих 24-х формул будет одна, время подсчета не сократится?Manyasha
AlexM, За час приблизительно добавляется 5 000 строк. Правильно, формул 24 потому как необходимо просуммировать значения соответствующие каждому часу. Получается своеобразный часовой кластер. При этом всё считается, но с отставанием, так как процессор не успевает пересчитывать значения. При работе только нескольких формул скорость пересчета вполне нормальная.
AlexM, За час приблизительно добавляется 5 000 строк. Правильно, формул 24 потому как необходимо просуммировать значения соответствующие каждому часу. Получается своеобразный часовой кластер. При этом всё считается, но с отставанием, так как процессор не успевает пересчитывать значения. При работе только нескольких формул скорость пересчета вполне нормальная.Denis_
Manyasha, еще заметил, что в начале дня мой вариант еще более менее работает, а к концу даже с одной формулой существенно отстаёт от скорости появления новых строк.
Manyasha, еще заметил, что в начале дня мой вариант еще более менее работает, а к концу даже с одной формулой существенно отстаёт от скорости появления новых строк.Denis_
А зачем суммировать постоянно? Когда нужно - протянули формулы и просчитали, можно макросом. Или макросом и считать, даже на 100000 будет быстро. Можно макросом считать раз в минуту например, или чаще.
А зачем суммировать постоянно? Когда нужно - протянули формулы и просчитали, можно макросом. Или макросом и считать, даже на 100000 будет быстро. Можно макросом считать раз в минуту например, или чаще.Hugo
Вариант с макросом. Надо сделать его запуск по событию. Макрос обрабатывает только вновь добавленные данные. Ячейка F1 хранит номер первой строки будущей порции данных. [vba]
Код
Sub Denis_Sum() Dim iRowOld As Long, iRowNew As Long Dim Arr, i As Long iRowOld = Cells(1, 6) iRowNew = Cells(iRowOld, 1).End(xlDown).Row If iRowNew = Rows.Count Then Exit Sub Arr = Range(Cells(iRowOld, 1), Cells(iRowNew, 3)) For i = 1 To UBound(Arr) If Arr(i, 3) = "Купля" Then Cells(Hour(Arr(i, 1)) + 2, 7) = Cells(Hour(Arr(i, 1)) + 2, 7) + Arr(i, 2) If Arr(i, 3) = "Продажа" Then Cells(Hour(Arr(i, 1)) + 2, 8) = Cells(Hour(Arr(i, 1)) + 2, 8) + Arr(i, 2) Next i Cells(1, 6) = iRowNew + 1 End Sub
Вариант с макросом. Надо сделать его запуск по событию. Макрос обрабатывает только вновь добавленные данные. Ячейка F1 хранит номер первой строки будущей порции данных. [vba]
Код
Sub Denis_Sum() Dim iRowOld As Long, iRowNew As Long Dim Arr, i As Long iRowOld = Cells(1, 6) iRowNew = Cells(iRowOld, 1).End(xlDown).Row If iRowNew = Rows.Count Then Exit Sub Arr = Range(Cells(iRowOld, 1), Cells(iRowNew, 3)) For i = 1 To UBound(Arr) If Arr(i, 3) = "Купля" Then Cells(Hour(Arr(i, 1)) + 2, 7) = Cells(Hour(Arr(i, 1)) + 2, 7) + Arr(i, 2) If Arr(i, 3) = "Продажа" Then Cells(Hour(Arr(i, 1)) + 2, 8) = Cells(Hour(Arr(i, 1)) + 2, 8) + Arr(i, 2) Next i Cells(1, 6) = iRowNew + 1 End Sub
AlexM, похоже считает правильно. Единственно уперся в 65563 строки и не выполняет работу. Попробую перенести код в 2007 версию. В понедельник отпишусь. Я так понял, что без макросов здесь никак.
AlexM, похоже считает правильно. Единственно уперся в 65563 строки и не выполняет работу. Попробую перенести код в 2007 версию. В понедельник отпишусь. Я так понял, что без макросов здесь никак.Denis_
Сообщение отредактировал Denis_ - Пятница, 03.04.2015, 19:10
AlexM, код работает, но проблема в том что процесс расчета должен идти непрерывно. А здесь получается что пересчет происходит только после нажатия кнопки пуск.
AlexM, код работает, но проблема в том что процесс расчета должен идти непрерывно. А здесь получается что пересчет происходит только после нажатия кнопки пуск.Denis_
Когда-то сталкивался с задачей импорта данные сторонней программы в Excel. Событие изменения значений на листе при при импорте и ручном вводе не то же самое. У меня нет возможности предложить проверенный вариант. Надеюсь коллеги подскажут решение.
Когда-то сталкивался с задачей импорта данные сторонней программы в Excel. Событие изменения значений на листе при при импорте и ручном вводе не то же самое. У меня нет возможности предложить проверенный вариант. Надеюсь коллеги подскажут решение.AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.