Объекты и свойства - помогите чайнику!
Как сделать PageSetup одной рабочей книги таким же, как PageSetup другой книги?
Хм.. например так:
.PageSetup.LeftMargin = Workbooks("Книга1").Worksheets("Лист1").PageSetup.LeftMargin
.PageSetup.HeaderMargin = Workbooks("Книга1").Worksheets("Лист1").PageSetup.HeaderMargin
.PageSetup.LeftFooter = Workbooks("Книга1").Worksheets("Лист1").PageSetup.LeftFooter
..........
и т.д.
End With
Хм.. например так:
.PageSetup.LeftMargin = Workbooks("Книга1").Worksheets("Лист1").PageSetup.LeftMargin
.PageSetup.HeaderMargin = Workbooks("Книга1").Worksheets("Лист1").PageSetup.HeaderMargin
.PageSetup.LeftFooter = Workbooks("Книга1").Worksheets("Лист1").PageSetup.LeftFooter
..........
и т.д.
End With
Можно создать и использовать шаблон.
успехов.
И еще вопросик. Моя прога формирует много файлов. Как ускорить ее работу?
А как сделать, чтобы установить все параметры страницы сразу, а то длинноватый код получается?
И еще вопросик. Моя прога формирует много файлов. Как ускорить ее работу?
На первый вопрос - по короче никак. Заковырка именно в слове "ВСЕ", потому как можно перебрать ВСЕ своства объекта PageSetup, но кроме нужных тебе, там будут присутствовать что всякие служебно вспомогательные, типа: Parent(ссылка на род. объект), Application (ссылка на объект Application) и т.д.. Поэтому тут по всякому придется поработать. Либо ты сама перечисляешь токо нужные тебе свойства(это нагляднее), либо устраиваешь цикл For Each по все свойствам и выкидываешь из него не нужные свойства. Вообще-то не вижу особой проблемы перечислить один раз все нужные тебе свойства (что тебя смущает? или ты думаешь что чем меньше в коде строк, тем быстрее он выполняется?!). Или ты думаешь что это код придется писать для каждой книги? ну это не проблема, оформи весь код в функцию и передавай туда книги/листы по ссылке By Ref. А в самом коде будешь уже токо писать - OdinakovPage(worksheets("Лист1"),worksheets("Лист2"))
Ye и наконеНу сли ты создаешь новые книги/листы, может более удобным вариантом будет создавать их на основе шаблона - это можно делать программно.
На счет второго вопроса: ты код то покажи, а то пока у нас здесь мало кто может телепатить
Моя прога создает новую рабочую книгу, копирует на нее содержимое листа исходной книги (Через Cells.Select - Copy - Paste. А может, можно как-то по другому? Скопировать нужно весь лист). редактирует содержимое некоторых ячеек, затем сохраняет файл. И так раз 500. Так вот, как сделать, чтобы это побыстрее работало?
Моя прога создает новую рабочую книгу, копирует на нее содержимое листа исходной книги (Через Cells.Select - Copy - Paste. А может, можно как-то по другому? Скопировать нужно весь лист). редактирует содержимое некоторых ячеек, затем сохраняет файл. И так раз 500. Так вот, как сделать, чтобы это побыстрее работало?
Без кода трудно определить что у тебя там тормозит так что могу дать токо общие рекомендации:
1. Копирование можно делать и без всякого Select, а прям сразу указываешь нужный диапазон:
destination:=Worksheets("Sheet2").Range("E5")
2. В твоем случае можно еще быстрее, копировать не диапазон а весь лист:
но самое приятно в это методе то, что можно писать даже так
тогда Excel сам создаст новую книгу и скопирует туда лист "Лист1". Чтобы не потерять открытую новую книгу можно написать так:
Workbooks("Книга1").Worksheets("Лист1").Copy
Set wr = ActiveWorkbook
2. Чтобы процесс выполнения макроса шел быстрее надо отключать разную фоновую обработку, например перерисовку экрана, вычисление формул и т.д.:
.ScreenUpdating = False
.Calculation = xlCalculationManual
.CalculateBeforeSave = False
.EnableAnimations = False
.ErrorCheckingOptions.BackgroundChecking = False
End With
Соответсвенно после работы макроса не забываем включить все обратно, особенно ScreenUpdating = True и .Calculation = xlCalculationAutomatic
3. Ну и третий самый главный момент, для того чтобы оптимизировать код надо выяснить какая его часть большего всего тормозит (а то может и осталные части по сравнее с этой и оптимизировать не будет никакого смысла). Для этого создай модуль и включи в него такую строку: Public Declare Function timeGetTime Lib "winmm.dll" () As Long
После этого ты можешь использовать эту функцию timeGetTime, которая возвращает текущее время в миллисекундах.
' в начале кода
lTimeBegin = timeGetTime
....
тут код
....
MsgBox "Первый кусок: " & timeGetTime - lTimeBegin
lTimeBegin = timeGetTime
....
тут вторая часть кода
....
MsgBox "Второй кусок: " & timeGetTime - lTimeBegin
lTimeBegin = timeGetTime
....
тут третья часть кода
....
MsgBox "Третий кусок: " & timeGetTime - lTimeBegin
lTimeBegin = timeGetTime
и т.д.
т.е. разбиваем код на смысловые куски и засекаем время выполнения каждого куска и уже потом анализируем полученную информацию.
Спасибо,SergeySV! Как только стала копировать лист, все заработало раза в 3 быстрее.:)
Всегда пожалуйста,... если что интересное и нужное не только тебя но и другим сварганишь, выкладывай в разделе "Исходники", пополним так сказать народную коллекцию. :)