VBA в Excel
Oct. 4th, 2010 11:17 pm![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
Друзья, нужна помощь с Экселем!
Имеется файл .xls с кучей листов, под завязку набитых однотипными записями (логи). Записей порядка 700000.
Записи имеют вид "Имя_человека" - "Дата_время" (ну и плюс всякие второстепенные данные). По одному человеку может быть куча записей в один день, но в разное время.
Необходимо обработать это все так, чтоб для каждого человека оставалась только одна запись за день, но с минимальным и максимальным временем за этот же день (в результате останется не так уж много строк, в один лист экселя все поместится).
Я смог написать только скрипт с тупым перебором (создается пустой лист, а потом данные каждой записи (человек+дата) проверяются на наличие в этом листе, и в случае отсутствия, добавляются туда). За выходные обработалось около 20% записей, хотя выполнялось на довольно шустром сервере.
Попробовал вместо вложенных циклов использовать FIND(), но стало еще хуже. На большее моей фантазии не хватает.
Посоветуйте механизм/алгоритм/процедуру, которые помогут решить поставленную задачи во вменяемые сроки (ну хотя бы чтоб за ночь обсчиталось). Не обязательно листинг приводить, подайте идею, докручу сам.
Да, использовать можно только встроенные функции Excel. Access, SQL, Delphi и прочие блага цивилизации, увы, недоступны.
Всем заранее спасибо.
Имеется файл .xls с кучей листов, под завязку набитых однотипными записями (логи). Записей порядка 700000.
Записи имеют вид "Имя_человека" - "Дата_время" (ну и плюс всякие второстепенные данные). По одному человеку может быть куча записей в один день, но в разное время.
Необходимо обработать это все так, чтоб для каждого человека оставалась только одна запись за день, но с минимальным и максимальным временем за этот же день (в результате останется не так уж много строк, в один лист экселя все поместится).
Я смог написать только скрипт с тупым перебором (создается пустой лист, а потом данные каждой записи (человек+дата) проверяются на наличие в этом листе, и в случае отсутствия, добавляются туда). За выходные обработалось около 20% записей, хотя выполнялось на довольно шустром сервере.
Попробовал вместо вложенных циклов использовать FIND(), но стало еще хуже. На большее моей фантазии не хватает.
Посоветуйте механизм/алгоритм/процедуру, которые помогут решить поставленную задачи во вменяемые сроки (ну хотя бы чтоб за ночь обсчиталось). Не обязательно листинг приводить, подайте идею, докручу сам.
Да, использовать можно только встроенные функции Excel. Access, SQL, Delphi и прочие блага цивилизации, увы, недоступны.
Всем заранее спасибо.
no subject
Date: 2010-10-04 07:30 pm (UTC)no subject
Date: 2010-10-04 08:29 pm (UTC)Кусок вывесить, увы не могу. Выглядит примерно так:
Столбец фамилий --- Столбец ID --- Столбец с датавременем
Вася Иванов --- ID Васи Иванова --- 01/01/1990 23:59
Петя Петров --- ID Пети Петрова --- 02/01/1990 22:59
no subject
Date: 2010-10-04 08:22 pm (UTC)но да, Excel тормозной, главная фишка - писать не по одной клетке, а заполнять массив (1-2 мерный) и присваивать его к Range объекту, например сразу целую строчку или несколько, на пару сотен клеток время тратится только чуть больше чем на одну клетку.
no subject
Date: 2010-10-04 08:31 pm (UTC)Насчет массив - спасибо, обдумаю.
no subject
Date: 2010-10-05 05:44 am (UTC)no subject
Date: 2010-10-04 09:08 pm (UTC)no subject
Date: 2010-10-04 09:18 pm (UTC)no subject
Date: 2010-10-05 04:49 am (UTC)Вот только не факт, что и это получится. Например, при удалении одного столбца одного листа этого файла, приложение зависает минут на 5 - слишком уж файл здоровый.
Re
Date: 2010-10-05 03:57 am (UTC)Re: Re
Date: 2010-10-05 04:51 am (UTC)Re
Date: 2010-10-05 04:57 am (UTC)Re: Re
Date: 2010-10-05 05:30 am (UTC)Re: Re
Date: 2010-10-05 05:17 pm (UTC)Но все равно спасибо.
no subject
Date: 2010-10-05 07:45 am (UTC)no subject
Date: 2010-10-05 05:26 pm (UTC)Могу накатать файл аналогичной структуры из пары десятков строк, но боюсь, производительность скрипта/функции это не покажет...
Если Вы на таких убогих данных готовы написать хотя бы приблизительную структуру скрипта, буду очень признателен.
no subject
Date: 2010-10-05 08:14 pm (UTC)no subject
Date: 2010-10-06 07:02 am (UTC)Но можно и в Excel. Так что - пришлёте? Самой интересно стало.
no subject
Date: 2010-10-05 08:10 am (UTC)Я бы сначала из "файл с кучей листов" сделала "куча файлов по одному листу" - пусть даже ручками. Мне при обработке "много-много данных" это помогало.
Дальше - есть в экселе такая радость, как сортировка таблицы по столбцу. Выделяем ВСЮ таблицу, и сортируем по столбцу человек
пишем скрипт который идёт по строчкам
если в этой строчке вася иванов а в следующей петя петров - васю переносим на второй лист
если же в следующей тоже вася то идём пока вася не кончится, обрабатываем собранного васю, и на следующий лист идёт одна запись, куда засунуто всё про васю
как-то так
затем после того как все листы так обработаны - собираем улов на один лист, и к этому листу применяем тот же метод (вдруг у нас вася не на одном листе наследил)
no subject
Date: 2010-10-05 05:19 pm (UTC)