![]() |
Модераторы: mihanik |
![]() ![]() ![]() |
|
НеуФазендник |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Добрый день, уважаемые.
Столкнулся с особенностью MS Excel: Организую вывод на рабочий лист больших объемов информации произвольного типа (приходится копировать их из другой книги) используется код cells() = a где а - буферная переменная типа variant (ВАЖНО!) для пересылки данных. Проблема в том, что код очень медленно исполняется. Если уйти от типа variant - всё работает в 10 раз быстрее. Но не могу я в своей задаче уйти от Variant. Это сложная программа. В ней много вывода больших объемов данных. Везде, где информация типизирована - всё выводится через переменные соответствующих типов. Здесь же никак: variant - нужен. Кроме того, проблема возникает уже не в первой моей программе. Я сталкиваюсь с нею на протяжении нескольких лет в совершенно разрозненных разработках. Использование таких вещей, как Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False на время работы циклов пересылки данных не приводит к исчезновению проблемы. Variant явно тормозит. 10000 ячеек выводятся минутами! Предполагаю, что, может есть какая-то возможность присвоить диапазону Range сразу - одним действием массив информации? Как это сделать? Кто, может, подскажет варианты для устранения проблемы? |
|||
|
||||
Staruha |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1292 Регистрация: 1.2.2004 Где: Казань Репутация: 13 Всего: 27 |
Попробуй
Книга1.Cells()=Книга2.Cells() -------------------- Возмездие настигнет |
|||
|
||||
НеуФазендник |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Нет, это пройденный этап.
Вообще выдает ошибку времени исполнения - не дает присваивать напрямую из одной книги в другую. Я не разбираясь обычно просто в таких случаях делал это через буферную переменную. Причем, как показало исследование - копирование массива из ячеек книги в память(в переменную или массив типа Variant) происходит без тормозов. Медленна - обратная операция - вставка данных variant в активный лист. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 26 Всего: 454 |
То есть в одной колонке встречаются записи разных типов? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Staruha |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1292 Регистрация: 1.2.2004 Где: Казань Репутация: 13 Всего: 27 |
нужно что бы обе книги были открыты -------------------- Возмездие настигнет |
|||
|
||||
НеуФазендник |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Нет, это подпрограмма универсального вывода на печать таблиц с разным форматом. Формат печатаемой таблицы и заголовки колонок она берет из одной базы данных, а сами данные из другой базы данных(другой книги), при этом не разбирая, что в какой колонке - просто кидает на лист распечатки, заодно фильтруя при этом, согласно заданному в конкретный момент критерию отбора, и ,после, форматирует по шаблонной ячейке из базы данных с описателем таблиц через копирования формата с использованием буфера обмена. Обе открыты. Книга с базой данных по таблицам по смыслу используется как надстройка Еxcel. (хотя не оформлена в виде надстройки - это обычный файл xls, который открывается вручную). В этой книге собственно, и содержится весь код VBA. Книга с собственно информационной базой данных подключается путем выполнения команды Workbooks.Open При этом обе книги оказываются корректно открыты. Т.к до того, как будет произведен вывод на печать, пользователь уже выбирает некоторые сведения из подключенного файла, получает некоторую информацию, на основе которой принимает решение о распечатке того или иного блока данных. Обе книги открыты - 100% - На этапе доработки кода мне часто приходится переключаться между их окнами, чтобы проверять, как отрабатывает вновь дописанный код. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 26 Всего: 454 |
Ты на поставленный вопрос ответить можешь? Повторю - В копируемом массиве бывает ли, чтобы в одной колонке присутствовали данные разных типов?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
НеуФазендник |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Бывает. База в большинство полей, имеющих вполне определенный формат (например дата) позволяет вносить/хранить нетипизированную информацию (например диапазон дат) - как текстовую строку. Это сообщение отредактировал(а) НеуФазендник - 13.4.2009, 11:59 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 26 Всего: 454 |
Хреново...
С другой стороны - в данных просто обязана быть какая-то логика. Значит, должны присутствовать блоки одинакового типа - т.е. весь массив пересылаемых данных должен состоять из таких блоков... насколько возможно пойти по пути пересылки именно таких блоков? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
НеуФазендник |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 9.5.2006 Репутация: нет Всего: 2 |
Да, конечно, возможно. У программиста в принципе не должно быть ничего невозможного. Тем более, что типизированна информация на 99,9% Просто отдельные поля иногда бывает, логичнее сделать с нестандартными значениями, чем менять под эти исключения структуру базы, расширяя число колонок в таблицах. Расплата - очевидна! Блоки то тоже прийдется анализировать, и каждый раз вновь и вновь проверяя кучу данных на их корректность, или делать дополнительную систему ссылок на кластеры однородных данных и следить за обновлением этой ссылочной модели. В, общем, всё не ажурно совсем выглядит. В идеале было бы правильно сделать все поля четко типизированными. Тем не менее проблема с медленной распечаткой Variant не отпадет. Не хочется с нею сталкиваться вновь и вновь в будущем. К тому же, существующий алгоритм перебрасывает одной и той же командой данные из различных колонок с различным (любым в общем-то) форматом в во вложенном цикле (по колонкам и по записям). Это достаточно компактный и универсальный алгоритм. Не хотелось бы его усложнять анализом содержимого и формата колонок. Хотелось бы найти универсальный способ, как все таки печатать Variant быстрее. Если его нет, тогда, конечно, буду корректировать алгоритмы с учетом этой, никак не устранимой особенности Excel. Это сообщение отредактировал(а) НеуФазендник - 13.4.2009, 12:16 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование, связанное с MS Office" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще!
|
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |