Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование массива в Range без использования цикл, Нужно скопировать блок на лист Excel 
:(
    Опции темы
НеуФазендник
Дата 10.4.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 сразу - одним действием массив информации?
Как это сделать? Кто, может, подскажет варианты для устранения проблемы?
 

PM MAIL   Вверх
Staruha
Дата 10.4.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 13
Всего: 27



Попробуй 
Книга1.Cells()=Книга2.Cells()


--------------------
Возмездие настигнет
PM MAIL   Вверх
НеуФазендник
Дата 10.4.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



Нет, это пройденный этап.
Вообще выдает ошибку времени исполнения - не дает присваивать напрямую из одной книги в другую.
Я не разбираясь обычно просто в таких случаях делал это через буферную переменную.
Причем, как показало исследование - копирование массива из ячеек книги в память(в переменную или массив типа Variant) происходит без тормозов. Медленна - обратная операция - вставка данных variant в активный лист.
PM MAIL   Вверх
Akina
Дата 10.4.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Staruha
Дата 11.4.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 13
Всего: 27



Цитата

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

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


--------------------
Возмездие настигнет
PM MAIL   Вверх
НеуФазендник
Дата 13.4.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



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

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

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

PM MAIL   Вверх
Akina
Дата 13.4.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
НеуФазендник
Дата 13.4.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



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

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

Это сообщение отредактировал(а) НеуФазендник - 13.4.2009, 11:59
PM MAIL   Вверх
Akina
Дата 13.4.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
НеуФазендник
Дата 13.4.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 9.5.2006

Репутация: нет
Всего: 2



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

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


Это сообщение отредактировал(а) НеуФазендник - 13.4.2009, 12:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.