![]() |
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум | ![]() |
![]() |
Лисоводы всех стран, объединяйтесь !!! |
После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Sergeynizamov Сообщений: 40 |
Добрый день! Есть код для вывода данных из Fox Pro в Excel, Через команды:
KK = 1 .Range("A1:Y37").Select .Selection.Copy .Range('A'+allt(str(kk))).Select .ActiveSheet.Paste .WorkSheets(1).HPageBreaks.Add (.Range("A37")) После команды .Selection.Copy, начинает последующие данные из таблицы выводить ОЧЕНЬ медленно! А первые данные выводит быстро, т.к. не копирует выделенную область и не вставляет! Подскажите, что можно сделать!? ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Taran Сообщений: 11533 Откуда: Красноярск |
Не делать select , а диапазон копировать напрямую.
В деталях не скажу, нет рядом. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
ssa Сообщений: 12637 Откуда: Москва |
Для начала попробовать так:
KK = 1 .Range("A1:Y37").Copy() .Range('A'+ltrim(str(kk))).Paste() .WorkSheets(1).HPageBreaks.Add (.Range("A37")) ------------------ Лень - это неосознанная мудрость. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Sergeynizamov Сообщений: 40 |
.Range('A'+ltrim(str(kk))).Paste() - выводится ошибка, прикреплю фаил ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
akvvohinc Автор Сообщений: 3190 Откуда: Москва |
Замените Paste на PasteSpecial.
![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Sergeynizamov Сообщений: 40 |
Тут суть вопроса вот в чем, у меня по сточно из таблицы выводятся данные, когда первую запись выводит - выводится достаточно быстро
а вот после: .Range("A1:Y37").Copy() .Range('A'+ltrim(str(kk))).Paste() .WorkSheets(1).HPageBreaks.Add (.Range("A37")) данной команды,следующая строка для вывода на печать и последующие начинают медленно выводится в сам excel, я так понимаю после копирования и вставки выделенной области, начинается перезаписывать данные, которые перешли вместе с скопированной области. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
akvvohinc Автор Сообщений: 3190 Откуда: Москва |
Цитата:Вы считаете, что команды "для вывода на печать и последующие" начинают выполняться ранее того момента, когда завершился процесс вставки? Или я совсем не понял, что какой именно процесс вы считаете "медленным". Предложенные вам команды Copy/Paste должны были ускорить только процедуру копирования/вставки. Всё, что вы делаете после этого, к этому отношения не имеет. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Sergeynizamov Сообщений: 40 |
SCAN
IF kk!=1 .Range("A1:Y37").Copy() .Range('A'+allt(str(kk))).Select .ActiveSheet.Paste parm_str(kk) .Range('R'+allt(str(kk+19))+':'+'Y'+allt(str(kk+36))).Delete(1) parm_line('R','Y',kk+17,kk+36) ENDIF kk=kk+1 DO NewStr with kk,"A",' ',.F.,' ','A-L',' ',' ',2,12,2,.F.,2 EndScan Вот кусочек кода, делаю через скан NewStr - это ссылка на процедуру Исправлено: Sergeynizamov, 21.01.21 14:21 ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
akvvohinc Автор Сообщений: 3190 Откуда: Москва |
И что нам делать с этим кодом?
Зачем вы вернули .Select? Значения в области A1:Y37 меняются? Зачем их постоянно копировать? Что делают функции parm_str() и parm_line() и процедура NewStr? По-прежнему неясно, что именно делается медленно. 1) Замерьте время работы этого кода. 2) уберите все лишнее, оставив только Copy и Paste и снова замерьте время. В общем изменяя этот код разными способами, вам надо понять, что конкретно тормозит. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Sergeynizamov Сообщений: 40 |
Нашел причину последующего вывода
.WorkSheets(1).HPageBreaks.Add (.Range("A37")) - разрыв страницы. почему сделал такие выводы: если использовать Copy() и Peste(), то выводится довольно быстро Как только добавил разрыв страницы - начинает последующие записи выводить очень медленно. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
akvvohinc Автор Сообщений: 3190 Откуда: Москва |
А я думаю, что проблема в .Select и ActiveSheet.Paste.
Уберите .Select. Замените .ActiveSheet.Paste на .Range(...).PasteSpecial(). Исправлено: akvvohinc, 22.01.21 23:57 ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Igor Korolyov Сообщений: 34067 |
После добавления ручных разрывов страницы эксель начнёт постоянно пересчитывать разбиение на страницы - лучше всё связанное с подготовкой к печати (расстановку ручных разрывов страницы, задание количества страниц куда надо уместить данные, колонтитулы и т.п.) выполнять ПОСЛЕ собственно вывода данных.
Ну и поддержу всех кто говорит что для копирования/вставки .Select и работа с .Selection не нужны. Вообще один из самых быстрых способов заполнения экселевского шаблона из фокса, это использование передачи данных через массив. А для форматирования, если нужно размножить шаблонную "строку" N раз, то лучше сделать это за одну операцию - Эксель умеет сам размножать блоки, даже если исходный блок не 1-строчный. И да, если в "шаблоне строки" нет собственно данных а есть лишь форматирование, то лучше использовать "специальную вставку" и вставлять только "форматирование". Впрочем, как правило такие оптимизации не нужны для более-менее вменяемых отчётов на 1-2-5-10 страниц. Разница между 1 секундой и 5-ю не важна (а чтобы эффективно всё закодировать может понадобится много усилий). Вот для странных людей генерирующих эксели с сотнями тысяч страниц (ещё и распечатывающих их потом) - это уже критически важно. ------------------ WBR, Igor ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
ssa Сообщений: 12637 Откуда: Москва |
Дополню: еще есть формирование файла без использования Excel. Ссылки я тут уже приводил. ------------------ Лень - это неосознанная мудрость. ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
Sergeynizamov Сообщений: 40 |
ВСЕМ ОГРОМНОЕ СПАСИБО ЗА СОВЕТЫ И ПОМОЩЬ!!!!!!!
Решил проблему по другому: Создал массив, где запоминается номер ячейки для разрыва страницы: и далее в конце всего вывода на печать пробегаю сканом по данному массивы и вставляю разрыв страницы: Примерно так: select tbl1 Go top ScanNom = 0 Scan ScanNom = tbl1.NomerRazr .WorkSheets(1).HPageBreaks.Add (.Range("A+Allt(Str(ScanNom)))) EndScan ![]() |
||
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно. | |||
---|---|---|---|
akvvohinc Автор Сообщений: 3190 Откуда: Москва |
Если за строки не платят, то можно сократить
SELECT tbl1 SCAN .WorkSheets(1).HPageBreaks.Add (.Range("A+TRAN(tbl1.NomerRazr))) ENDSCAN ![]() |
||
© 2000-2021 Fox Club  |