for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

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

Сообщений: 40
Дата: 18.01.21 06:59:08
Добрый день! Есть код для вывода данных из 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

Сообщений: 11448
Откуда: Красноярск
Дата: 18.01.21 09:22:32
Не делать select , а диапазон копировать напрямую.
В деталях не скажу, нет рядом.
Ratings: 0 negative/0 positive

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

Сообщений: 12630
Откуда: Москва
Дата: 18.01.21 09:36:45
Для начала попробовать так:

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
Автор

Сообщений: 40
Дата: 20.01.21 11:55:25
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

Сообщений: 3186
Откуда: Москва
Дата: 20.01.21 12:42:41
Замените Paste на PasteSpecial.
Ratings: 0 negative/0 positive

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

Сообщений: 40
Дата: 20.01.21 13:12:58
Тут суть вопроса вот в чем, у меня по сточно из таблицы выводятся данные, когда первую запись выводит - выводится достаточно быстро
а вот после:
.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

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

Предложенные вам команды Copy/Paste должны были ускорить только процедуру копирования/вставки.
Всё, что вы делаете после этого, к этому отношения не имеет.
Ratings: 0 negative/0 positive

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

Сообщений: 40
Дата: 21.01.21 14:20:10
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
Ratings: 0 negative/0 positive

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

Сообщений: 3186
Откуда: Москва
Дата: 21.01.21 22:30:53
И что нам делать с этим кодом?

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

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

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

Сообщений: 40
Дата: 22.01.21 07:54:36
Нашел причину последующего вывода

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

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

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



Исправлено: akvvohinc, 22.01.21 23:57
Ratings: 0 negative/0 positive

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

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

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

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

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

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

Сообщений: 40
Дата: 25.01.21 09:44:54
ВСЕМ ОГРОМНОЕ СПАСИБО ЗА СОВЕТЫ И ПОМОЩЬ!!!!!!!

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

Создал массив, где запоминается номер ячейки для разрыва страницы:
и далее в конце всего вывода на печать пробегаю сканом по данному массивы и вставляю разрыв страницы:
Примерно так:
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

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



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

On-line: 15 pasha_usue  (Гостей: 14)


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