Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Копирование массива в Range без использования цикл


Автор: НеуФазендник 10.4.2009, 09:35
Добрый день, уважаемые.
Столкнулся с особенностью MS Excel:
Организую вывод на рабочий лист больших объемов информации произвольного типа (приходится копировать их из другой книги) используется код 
cells() = a
где а - буферная переменная типа variant (ВАЖНО!) для пересылки данных.
Проблема в том, что код очень медленно исполняется. Если уйти от типа variant - всё работает в 10 раз быстрее.
Но не могу я в своей задаче уйти от Variant.
Это сложная программа. В ней много вывода больших объемов данных. Везде, где информация типизирована - всё выводится через переменные соответствующих типов. Здесь же никак: variant - нужен.
Кроме того, проблема возникает уже не в первой моей программе. Я сталкиваюсь с нею на протяжении нескольких лет в совершенно разрозненных разработках. Использование таких вещей, как
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
на время работы циклов пересылки данных не приводит к исчезновению проблемы.
Variant явно тормозит. 10000 ячеек выводятся минутами!
Предполагаю, что, может есть какая-то возможность присвоить диапазону Range сразу - одним действием массив информации?
Как это сделать? Кто, может, подскажет варианты для устранения проблемы?
 

Автор: Staruha 10.4.2009, 11:37
Попробуй 
Книга1.Cells()=Книга2.Cells()

Автор: НеуФазендник 10.4.2009, 14:35
Нет, это пройденный этап.
Вообще выдает ошибку времени исполнения - не дает присваивать напрямую из одной книги в другую.
Я не разбираясь обычно просто в таких случаях делал это через буферную переменную.
Причем, как показало исследование - копирование массива из ячеек книги в память(в переменную или массив типа Variant) происходит без тормозов. Медленна - обратная операция - вставка данных variant в активный лист.

Автор: Akina 10.4.2009, 16:04
Цитата(НеуФазендник @  10.4.2009,  10:35 Найти цитируемый пост)
Везде, где информация типизирована - всё выводится через переменные соответствующих типов. Здесь же никак: variant - нужен.

То есть в одной колонке встречаются записи разных типов?

Автор: Staruha 11.4.2009, 16:52
Цитата

Вообще выдает ошибку

нужно что бы обе книги были открыты

Автор: НеуФазендник 13.4.2009, 11:22
Цитата(Akina @  10.4.2009,  16:04 Найти цитируемый пост)
То есть в одной колонке встречаются записи разных типов? 

Нет, это подпрограмма универсального вывода на печать таблиц с разным форматом.
Формат печатаемой таблицы и заголовки колонок она берет из одной базы данных, а сами данные из другой базы данных(другой книги), при этом не разбирая, что в какой колонке - просто кидает на лист распечатки, заодно фильтруя при этом, согласно заданному в конкретный момент критерию отбора, и ,после, форматирует по шаблонной ячейке из базы данных с описателем таблиц через копирования формата с использованием буфера обмена.
Цитата(Staruha @  11.4.2009,  16:52 Найти цитируемый пост)
нужно что бы обе книги были открыты 

Обе открыты. Книга с базой данных по таблицам по смыслу используется как надстройка Еxcel. (хотя не оформлена в виде надстройки - это обычный файл xls, который открывается вручную). В этой книге собственно, и содержится весь код VBA.
Книга с собственно информационной базой данных подключается путем выполнения команды 
Workbooks.Open
При этом обе книги оказываются корректно открыты. Т.к до того, как будет произведен вывод на печать, пользователь уже выбирает некоторые сведения из подключенного файла, получает некоторую информацию, на основе которой принимает решение о распечатке того или иного блока данных. Обе книги открыты - 100% - На этапе доработки кода мне часто приходится переключаться между их окнами, чтобы проверять, как отрабатывает вновь дописанный код.

Автор: Akina 13.4.2009, 11:27
Ты на поставленный вопрос ответить можешь? Повторю - В копируемом массиве бывает ли, чтобы в одной колонке присутствовали данные разных типов?

Автор: НеуФазендник 13.4.2009, 11:51
Цитата(Akina @  13.4.2009,  11:27 Найти цитируемый пост)
В копируемом массиве бывает ли, чтобы в одной колонке присутствовали данные разных типов? 

Бывает.
База в большинство полей, имеющих вполне определенный формат (например дата) позволяет вносить/хранить нетипизированную информацию (например диапазон дат) - как текстовую строку. 

Автор: Akina 13.4.2009, 11:58
Хреново... 
С другой стороны - в данных просто обязана быть какая-то логика. Значит, должны присутствовать блоки одинакового типа - т.е. весь массив пересылаемых данных должен состоять из таких блоков... насколько возможно пойти по пути пересылки именно таких блоков?

Автор: НеуФазендник 13.4.2009, 12:12
Цитата(Akina @  13.4.2009,  11:58 Найти цитируемый пост)
насколько возможно пойти по пути пересылки именно таких блоков? 

Да, конечно, возможно. У программиста в принципе не должно быть ничего невозможного. Тем более, что типизированна информация на 99,9%
Просто отдельные поля иногда бывает, логичнее сделать с нестандартными значениями, чем менять под эти исключения структуру базы, расширяя число колонок в таблицах. Расплата - очевидна! Блоки то тоже прийдется анализировать, и каждый раз вновь и вновь проверяя кучу данных на их корректность, или делать дополнительную систему ссылок на кластеры однородных данных и следить за обновлением этой ссылочной модели. В, общем, всё не ажурно совсем выглядит. В идеале было бы правильно сделать все поля четко типизированными. Тем не менее проблема с медленной распечаткой Variant не отпадет. Не хочется с нею сталкиваться вновь и вновь в будущем. К тому же, существующий алгоритм перебрасывает одной и той же командой данные из различных колонок с различным (любым в общем-то) форматом в во вложенном цикле (по колонкам и по записям). Это достаточно компактный и универсальный алгоритм. Не хотелось бы его усложнять анализом содержимого и формата колонок.  Хотелось бы найти универсальный способ, как все таки печатать Variant быстрее.
Если его нет, тогда, конечно, буду корректировать алгоритмы с учетом этой, никак не устранимой особенности Excel.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)