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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2009, 13:05   #1
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 28.04.2008
Сообщений: 116
По умолчанию Работаем с фильтром...

Добрый день!

В одной из своих тем Работа с EXCEL... я затронул, актуальный для меня вопрос фильтра. В этой теме я пришел с помощью EducatedFool к выводу, что параметры фильтра формируются при каждом нажатии на кнопку фильтра.

В настоящий момент передо мной стоит задача максимально эффективно (быстро) получить возможные параметры фильтра.

В исходной таблице 12 000 строк.

Определение параметров фильтра произвожу по следующему алгоритму:
1. Завожу массив значений фильтра.
2. Первому значению массива присваиваю первое значение таблицы (столбец 1).
3. Перехожу к следующему значению таблицы.
4. Проверяю на совпадение со всеми уже имеющимися значениями в массиве.
5. Если результат положительный (совпадения есть), то перехожу к следующему значению. В случае если отрицательный, то добавляю в массив значений.
6. И так до конца таблицы

Такой способ определения параметров фильтра мне кажется не эффективным. Обработка 12 000 ячеек на моем компьютере занимает порядка 40 секунд, при 12 параметрах фильтра. Если обратиться к тому же Excel и нажать на кнопку фильтра, то возможные параметры для выбора появятся уже через секунду!!!

КАК ЖЕ ОН (Excel) ЭТО ДЕЛАЕТ????

P.S. Алгоритм выполняю в Delphi.
nikolai_P вне форума Ответить с цитированием
Старый 12.03.2009, 16:53   #2
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 28.04.2008
Сообщений: 116
По умолчанию

Вот так вопрос я задал)
30 просмотров и не одного предложения!!!
nikolai_P вне форума Ответить с цитированием
Старый 12.03.2009, 18:13   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Обработка 12 000 ячеек на моем компьютере занимает порядка 40 секунд, при 12 параметрах фильтра.
Это потому, что Вы перебирали по одной ячейке.
Значительно ускорить процесс (в сотни раз) можно, одной командой считав диапазон ячеек в массив, и обрабатывая уже элементы массива.

В VBA это делается примерно так:
dim arr() ' объявляем массив
arr = Range("C4:E20000").value ' считываем в него значения из диапазона ячеек

Потом в цикле перебираем все элементы массива, и заносим их в коллекцию (для каждого элемента формируя ключ на основе этого же элемента массива)
В результате в коллекции оказываются только уникальные значения.
EducatedFool вне форума Ответить с цитированием
Старый 13.03.2009, 09:26   #4
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 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');
Что это - позднее связывание?
nikolai_P вне форума Ответить с цитированием
Старый 13.03.2009, 10:21   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Если Вас не затруднит, то подскажите, пожалуйста, как сделать тоже самое на Delphi.
Ещё как затруднит...
Я ни разу не сталкивался с Delphi, и совершенно не знаком ни с его синтаксисом, ни с его возможностями.

Цитата:
Импортируем данные из Excel в удобочитаемую, -обрабатываемую таблицу Delphi
Сомневаюсь, что для данных на листа Excel есть более удобочитаемые варианты размещения в других программах.

Может, обойтись без Delphi, ограничившись макросами?
По-моему, так будет намного проще.

Цитата:
Начал было читать про раннее и позднее связывание, чтобы хоть как-то ускорить процесс
Тут проблема не в связывании - хоть раннее связывание Вы будете использовать, хоть позднее, - всё равно последовательный перебор 12000 ячеек займёт очень много времени.

Единственный выход - считать одной командой диапазон ячеек в массив.
Считайте, что Range("C4:E20000").value - это массив с данными размером (0 to 19996, 0 to 2)

Вам надо одной командой переписать содержимое этого массива в другой массив.
Как это реализовать в Delphi - я не знаю. (в VBA всё просто - arr = Range("C4:E20000").value)
EducatedFool вне форума Ответить с цитированием
Старый 13.03.2009, 11:01   #6
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 28.04.2008
Сообщений: 116
По умолчанию

Цитата:
Ещё как затруднит...
Я ни разу не сталкивался с Delphi, и совершенно не знаком ни с его синтаксисом, ни с его возможностями.
Все равно спасибо, Уважаемый EducatedFool!

Цитата:
Может, обойтись без Delphi, ограничившись макросами?
Можно, но легких путей не ищу. Я считаю, что с помощью Delphi можно написать более гибкую программу.
nikolai_P вне форума Ответить с цитированием
Старый 13.03.2009, 12:51   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Можно, но легких путей не ищу.
Ну и зря. Давно бы уже написали макрос.

Цитата:
Я считаю, что с помощью Delphi можно написать более гибкую программу.
Более гибко, чем VBA, с файлами Excel ничего работать не будет.
Не забывайте, что VBA именно для этого и разрабатывался.
EducatedFool вне форума Ответить с цитированием
Старый 13.03.2009, 14:04   #8
nikolai_P
Форумчанин Подтвердите свой е-майл
 
Регистрация: 28.04.2008
Сообщений: 116
По умолчанию Сдаюсь... буду писать на VBA!

Хотел Вам вот что написать:
Цитата:
В плане выполнения работы бесспорно Вы правы!

Но не надо забывать что потребителем программы являются люди, не являющиеся программистами. А им хотелось бы иметь гибкие настройки: поменять цвет и размер шрифта, цвет шапки, видеть ход выполнения программы (убеждаться что компьютер не завис при обработке большого массива), строить выборочно таблицы, а не все целиком.

Что скажете на это? Посильно все это VBA?
Но поковырялся немного в Excel и решил, что лучше не стоит)
Вы меня переубедили!!! Сегодня ночь посвящу VBA.
nikolai_P вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с фильтром и счет уникальных значений в диапазоне 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