:: Visual Foxpro, Foxpro for DOS
После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Sergeynizamov

Сообщений: 76
Дата регистрации: 21.09.2018
Добрый день! Есть код для вывода данных из 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, начинает последующие данные из таблицы выводить ОЧЕНЬ медленно! А первые данные выводит быстро, т.к. не копирует выделенную область и не вставляет!
Подскажите, что можно сделать!?
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Не делать select , а диапазон копировать напрямую.
В деталях не скажу, нет рядом.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Для начала попробовать так:

KK = 1
.Range("A1:Y37").Copy()
.Range('A'+ltrim(str(kk))).Paste()
.WorkSheets(1).HPageBreaks.Add (.Range("A37"))


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Sergeynizamov

Сообщений: 76
Дата регистрации: 21.09.2018
ssa
Для начала попробовать так:
KK = 1
.Range("A1:Y37").Copy()
.Range('A'+ltrim(str(kk))).Paste()
.WorkSheets(1).HPageBreaks.Add (.Range("A37"))

.Range('A'+ltrim(str(kk))).Paste() - выводится ошибка, прикреплю фаил
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
akvvohinc
Автор

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
Замените Paste на PasteSpecial.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Sergeynizamov

Сообщений: 76
Дата регистрации: 21.09.2018
Тут суть вопроса вот в чем, у меня по сточно из таблицы выводятся данные, когда первую запись выводит - выводится достаточно быстро
а вот после:
.Range("A1:Y37").Copy()
.Range('A'+ltrim(str(kk))).Paste()
.WorkSheets(1).HPageBreaks.Add (.Range("A37"))
данной команды,следующая строка для вывода на печать и последующие начинают медленно выводится в сам excel,
я так понимаю после копирования и вставки выделенной области, начинается перезаписывать данные, которые перешли вместе с скопированной области.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
akvvohinc
Автор

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
следующая строка для вывода на печать и последующие начинают медленно выводится в сам excel,
я так понимаю после копирования и вставки выделенной области, начинается перезаписывать данные, которые перешли вместе с скопированной области.
Вы считаете, что команды "для вывода на печать и последующие" начинают выполняться ранее того момента, когда завершился процесс вставки?
Или я совсем не понял, что какой именно процесс вы считаете "медленным".

Предложенные вам команды Copy/Paste должны были ускорить только процедуру копирования/вставки.
Всё, что вы делаете после этого, к этому отношения не имеет.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Sergeynizamov

Сообщений: 76
Дата регистрации: 21.09.2018
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 - это ссылка на процедуру



Исправлено 1 раз(а). Последнее : Sergeynizamov, 21.01.21 14:21
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
akvvohinc
Автор

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
И что нам делать с этим кодом?

Зачем вы вернули .Select?
Значения в области A1:Y37 меняются? Зачем их постоянно копировать?
Что делают функции parm_str() и parm_line() и процедура NewStr?

По-прежнему неясно, что именно делается медленно.
1) Замерьте время работы этого кода.
2) уберите все лишнее, оставив только Copy и Paste и снова замерьте время.
В общем изменяя этот код разными способами, вам надо понять, что конкретно тормозит.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Sergeynizamov

Сообщений: 76
Дата регистрации: 21.09.2018
Нашел причину последующего вывода

.WorkSheets(1).HPageBreaks.Add (.Range("A37")) - разрыв страницы.
почему сделал такие выводы: если использовать Copy() и Peste(), то выводится довольно быстро
Как только добавил разрыв страницы - начинает последующие записи выводить очень медленно.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
akvvohinc
Автор

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
А я думаю, что проблема в .Select и ActiveSheet.Paste.
Уберите .Select.
Замените .ActiveSheet.Paste на .Range(...).PasteSpecial().



Исправлено 1 раз(а). Последнее : akvvohinc, 22.01.21 23:57
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
После добавления ручных разрывов страницы эксель начнёт постоянно пересчитывать разбиение на страницы - лучше всё связанное с подготовкой к печати (расстановку ручных разрывов страницы, задание количества страниц куда надо уместить данные, колонтитулы и т.п.) выполнять ПОСЛЕ собственно вывода данных.
Ну и поддержу всех кто говорит что для копирования/вставки .Select и работа с .Selection не нужны.

Вообще один из самых быстрых способов заполнения экселевского шаблона из фокса, это использование передачи данных через массив. А для форматирования, если нужно размножить шаблонную "строку" N раз, то лучше сделать это за одну операцию - Эксель умеет сам размножать блоки, даже если исходный блок не 1-строчный. И да, если в "шаблоне строки" нет собственно данных а есть лишь форматирование, то лучше использовать "специальную вставку" и вставлять только "форматирование".
Впрочем, как правило такие оптимизации не нужны для более-менее вменяемых отчётов на 1-2-5-10 страниц. Разница между 1 секундой и 5-ю не важна (а чтобы эффективно всё закодировать может понадобится много усилий). Вот для странных людей генерирующих эксели с сотнями тысяч страниц (ещё и распечатывающих их потом) - это уже критически важно.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Igor Korolyov
Вообще один из самых быстрых способов заполнения экселевского шаблона из фокса, это использование передачи данных через массив.
Дополню: еще есть формирование файла без использования Excel. Ссылки я тут уже приводил.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
Sergeynizamov

Сообщений: 76
Дата регистрации: 21.09.2018
ВСЕМ ОГРОМНОЕ СПАСИБО ЗА СОВЕТЫ И ПОМОЩЬ!

Решил проблему по другому:

Создал массив, где запоминается номер ячейки для разрыва страницы:
и далее в конце всего вывода на печать пробегаю сканом по данному массивы и вставляю разрыв страницы:
Примерно так:
select tbl1
Go top
ScanNom = 0
Scan
ScanNom = tbl1.NomerRazr
.WorkSheets(1).HPageBreaks.Add (.Range("A+Allt(Str(ScanNom))))
EndScan
Ratings: 0 negative/0 positive
Re: После копирования в книге Excel через команду Copy, следующие данные выводятся ОЧЕНЬ медленно.
akvvohinc
Автор

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
Если за строки не платят, то можно сократить
SELECT tbl1
SCAN
.WorkSheets(1).HPageBreaks.Add (.Range("A+TRAN(tbl1.NomerRazr)))
ENDSCAN
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика