|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.03.2009, 13:05 | #1 |
Форумчанин Подтвердите свой е-майл
Регистрация: 28.04.2008
Сообщений: 116
|
Работаем с фильтром...
Добрый день!
В одной из своих тем Работа с EXCEL... я затронул, актуальный для меня вопрос фильтра. В этой теме я пришел с помощью EducatedFool к выводу, что параметры фильтра формируются при каждом нажатии на кнопку фильтра. В настоящий момент передо мной стоит задача максимально эффективно (быстро) получить возможные параметры фильтра. В исходной таблице 12 000 строк. Определение параметров фильтра произвожу по следующему алгоритму: 1. Завожу массив значений фильтра. 2. Первому значению массива присваиваю первое значение таблицы (столбец 1). 3. Перехожу к следующему значению таблицы. 4. Проверяю на совпадение со всеми уже имеющимися значениями в массиве. 5. Если результат положительный (совпадения есть), то перехожу к следующему значению. В случае если отрицательный, то добавляю в массив значений. 6. И так до конца таблицы Такой способ определения параметров фильтра мне кажется не эффективным. Обработка 12 000 ячеек на моем компьютере занимает порядка 40 секунд, при 12 параметрах фильтра. Если обратиться к тому же Excel и нажать на кнопку фильтра, то возможные параметры для выбора появятся уже через секунду!!! КАК ЖЕ ОН (Excel) ЭТО ДЕЛАЕТ???? P.S. Алгоритм выполняю в Delphi. |
12.03.2009, 16:53 | #2 |
Форумчанин Подтвердите свой е-майл
Регистрация: 28.04.2008
Сообщений: 116
|
Вот так вопрос я задал)
30 просмотров и не одного предложения!!! |
12.03.2009, 18:13 | #3 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Цитата:
Значительно ускорить процесс (в сотни раз) можно, одной командой считав диапазон ячеек в массив, и обрабатывая уже элементы массива. В VBA это делается примерно так: dim arr() ' объявляем массив arr = Range("C4:E20000").value ' считываем в него значения из диапазона ячеек Потом в цикле перебираем все элементы массива, и заносим их в коллекцию (для каждого элемента формируя ключ на основе этого же элемента массива) В результате в коллекции оказываются только уникальные значения. |
|
13.03.2009, 09:26 | #4 |
Форумчанин Подтвердите свой е-майл
Регистрация: 28.04.2008
Сообщений: 116
|
УВАЖАЕМЫЙ, EducatedFool!
Похоже мне теперь всегда придется так к Вам обращаться) Если Вас не затруднит, то подскажите, пожалуйста, как сделать тоже самое на Delphi. Уважаемый, EducatedFool, передо мной стоит задача обработки исходника (Excel) и формирование структурированного отчета (тоже в Excel). Я новичок в программировании на Delphi, но буду Вам очень признателен если Вы поможете мне, направив меня в нужное русло. Мною были рассмотрены два возможных варианта выполнения задачи. 1 вариант. Импортируем данные из Excel в удобочитаемую, -обрабатываемую таблицу Delphi. Затем обрабатываем данные и переносим их в Excel. Здесь меня подвела моя неопытность. Я не знаю есть ли такие инструменты для работы в Delphi. И какие у них возможности. 2 вариант. Работам с самой наверно удобной таблицей Excel из Delphi,т.е. добавляем фильтр, сводные таблицы и др. Здесь я потратил 1,5 недели вечеров и пришел к выводу, что не любой макрос VBA можно перености в Delphi!!! Полюс ко всему очень сильно возрастает время выполнения работы програмой. Начал было читать про раннее и позднее связывание, чтобы хоть как-то ускорить процесс, но пока так и не понял принципиальной разницы. Я действую следующим образом: добавляю ComObj в Uses и пользуюсь функцией Excel:=CreateOleObject('Excel.Appli cation'); Что это - позднее связывание? |
13.03.2009, 10:21 | #5 | |||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Цитата:
Я ни разу не сталкивался с Delphi, и совершенно не знаком ни с его синтаксисом, ни с его возможностями. Цитата:
Может, обойтись без Delphi, ограничившись макросами? По-моему, так будет намного проще. Цитата:
Единственный выход - считать одной командой диапазон ячеек в массив. Считайте, что Range("C4:E20000").value - это массив с данными размером (0 to 19996, 0 to 2) Вам надо одной командой переписать содержимое этого массива в другой массив. Как это реализовать в Delphi - я не знаю. (в VBA всё просто - arr = Range("C4:E20000").value) |
|||
13.03.2009, 11:01 | #6 | ||
Форумчанин Подтвердите свой е-майл
Регистрация: 28.04.2008
Сообщений: 116
|
Цитата:
Цитата:
|
||
13.03.2009, 12:51 | #7 | ||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Цитата:
Цитата:
Не забывайте, что VBA именно для этого и разрабатывался. |
||
13.03.2009, 14:04 | #8 | |
Форумчанин Подтвердите свой е-майл
Регистрация: 28.04.2008
Сообщений: 116
|
Сдаюсь... буду писать на VBA!
Хотел Вам вот что написать:
Цитата:
Вы меня переубедили!!! Сегодня ночь посвящу VBA. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с фильтром и счет уникальных значений в диапазоне | necton | Microsoft Office Excel | 2 | 19.02.2009 12:40 |
Combobox с фильтром | Legat | Общие вопросы Delphi | 4 | 10.02.2009 14:51 |
edit с фильтром аля Google | 1sal1 | БД в Delphi | 1 | 07.07.2008 20:34 |
Показываем объект и только потом работаем дальше | celovec | Общие вопросы Delphi | 7 | 25.03.2008 15:28 |
Работаем с РЕЕСТРОМ | Altera | Windows | 7 | 12.02.2008 18:53 |