Страницы: 1 2 След.
RSS
Как ускорить код, задающий параметры печати
 
Здравствуйте.
     Есть код, задающий параметры печати для файлов в папке (я его применяю для файлов *.xls):
Код
Option Explicit
Private Function GetValue(path, file, sheet, ref)
Dim arg As String
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "Файл не найден"
Exit Function
End If
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
GetValue = ExecuteExcel4Macro(arg)
End Function
Sub Найти_документы()
Const AddrresCell = 4
Dim p As String 'Директория файлов
Dim f As String 'Имя файла
Dim s As String 'Имя листа
Dim a As String 'Адрес ячейки
Dim Rng As Range, Sht As Worksheet
Dim i&, g&, h&, y&
Dim PName As String, FName As String, FQuant As Long, N As Long, d As String, WB As Workbook, firstAddress As String
Dim SkolkoNashol As Long
Dim SumFlag As Long
Dim TWB As Workbook
Set TWB = ThisWorkbook
'Вызываем диалоговое окно для определения папки с файлами
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & "\"
.Title = "Укажите папку, в которой находятся файлы"
.Show
If .SelectedItems.Count = 0 Then
MsgBox "Отменено" 'Прекращение работы
Exit Sub
Else
PName = .SelectedItems(1) 'Получение пути

'Считаем количество файлов в папке для создания массива названий файлов
FName = Dir(PName & "\*.xls") 'Получаем имя первого файла
FQuant = 0 'обнуляем кол-во файлов
' Цикл подсчета кол-ва файлов
Do Until FName = "" 'Пока имя файла не станет пустым
FQuant = FQuant + 1 'Счетчик кол-ва
FName = Dir 'Получение следующего имени файла
Loop
'Заполняем массив названиями файлов
ReDim arr(1 To FQuant) As String 'Задание размерности массива на основе кол-ва файлов
FName = Dir(PName & "\*.xls") 'Получаем имя первого файла
N = 0 'обнуляем счетчик
' Цикл заполнения массива именами файлов
Do Until FName = "" 'Пока имя файла не станет пустым
N = N + 1 'Счетчик размерности массива
arr(N) = FName 'Заполнение ячейки массива
FName = Dir 'Получение следующего имени файла
Loop
N = 0
'Цикл перебора файлов
d = InputBox("Что ищем?")
If IsNull(d) Then Exit Sub
y = 1
For N = 1 To FQuant
SumFlag = 0
p = PName & "\" 'Директория файлов
f = arr(N) 'получаем имя файла
s = Left(arr(N), Len(arr(N)) - 5) 'получаем имя листа
'On Error Resume Next
Set WB = Workbooks.Open(p & f)
'Set WB = GetObject(p & f)
'Workbooks(f).Activate
For Each Sht In WB.Sheets 'цикл по всем листам в файле
Sht.PageSetup.LeftHeader = ""
Sht.PageSetup.CenterHeader = ""
Sht.PageSetup.RightHeader = ""
Sht.PageSetup.LeftFooter = ""
Sht.PageSetup.CenterFooter = ""
Sht.PageSetup.RightFooter = ""
Sht.PageSetup.LeftMargin = Application.InchesToPoints(0.393700787401575)
Sht.PageSetup.RightMargin = Application.InchesToPoints(0.393700787401575)
Sht.PageSetup.TopMargin = Application.InchesToPoints(0.393700787401575)
Sht.PageSetup.BottomMargin = Application.InchesToPoints(0.393700787401575)
Sht.PageSetup.HeaderMargin = Application.InchesToPoints(0)
Sht.PageSetup.FooterMargin = Application.InchesToPoints(0)
Sht.PageSetup.PrintHeadings = False
Sht.PageSetup.PrintGridlines = False
Sht.PageSetup.PrintComments = xlPrintNoComments
Sht.PageSetup.PrintQuality = 600
Sht.PageSetup.CenterHorizontally = False
Sht.PageSetup.CenterVertically = False
Sht.PageSetup.Orientation = xlPortrait
Sht.PageSetup.Draft = False
Sht.PageSetup.PaperSize = xlPaperA4
Sht.PageSetup.FirstPageNumber = xlAutomatic
Sht.PageSetup.Order = xlOverThenDown
Sht.PageSetup.BlackAndWhite = False
Sht.PageSetup.Zoom = False
Sht.PageSetup.FitToPagesWide = 1
Sht.PageSetup.FitToPagesTall = False
Sht.PageSetup.PrintErrors = xlPrintErrorsDisplayed
Sht.PageSetup.OddAndEvenPagesHeaderFooter = False
Sht.PageSetup.DifferentFirstPageHeaderFooter = False
Sht.PageSetup.ScaleWithDocHeaderFooter = True
Sht.PageSetup.AlignMarginsHeaderFooter = False
Sht.PageSetup.EvenPage.LeftHeader.Text = ""
Sht.PageSetup.EvenPage.CenterHeader.Text = ""
Sht.PageSetup.EvenPage.RightHeader.Text = ""
Sht.PageSetup.EvenPage.LeftFooter.Text = ""
Sht.PageSetup.EvenPage.CenterFooter.Text = ""
Sht.PageSetup.EvenPage.RightFooter.Text = ""
Sht.PageSetup.FirstPage.LeftHeader.Text = ""
Sht.PageSetup.FirstPage.CenterHeader.Text = ""
Sht.PageSetup.FirstPage.RightHeader.Text = ""
Sht.PageSetup.FirstPage.LeftFooter.Text = ""
Sht.PageSetup.FirstPage.CenterFooter.Text = ""
Sht.PageSetup.FirstPage.RightFooter.Text = ""
Next Sht
If Rng Is Nothing Then 'если не нашли
GoTo Metka
End If
Metka:
WB.Close
Next N
If Rng Is Nothing Then 'если не нашли
MsgBox "Не найдено ни на одном листе ни в одной книге!", vbExclamation, "Конец"
End If
End If
End With
End Sub

Работает он так: я запускаю код, в открывшемся окне выбираю папку, в следующем окне пишу "xls"(без кавычек, конечно), и код задаёт параметры печати - книжную ориентацию и умещение на одной странице - во всех найденных xls-файлах. Вот только делает он это очень медленно. Скажите, пожалуйста, можно ли его как-то ускорить?
 
Помогите, пожалуйста.
 
Счастливчик, попробуйте так,

Скрытый текст
 
Счастливчик, здравствуйте
With и отключение событий, конечно, могут помочь, но я бы начал с замеров времени — действительно ли параметры печати замедляют…

Если они виноваты, то:
    • можно проверить, действительно ли ВСЕ эти параметры нужно задавать.
    • можно проверять параметр и не присваивать, если он уже нужный.
    • можно заменить Application.InchesToPoints() на заранее вычисленные значения или на свою, более шуструю, функцию.

Также, вполне возможно, что можно как-то задать шаблон, и, возможно, это будет быстрее, но тут не подскажу.
Изменено: Jack Famous - 25.04.2024 17:08:04
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
lost.eu,
Скажите, пожалуйста, а Вы учли, что при выполнении моего кода нужно вручную подтвердить сохранение каждого файла после внесения изменения в параметры печати? Ваш код выполняется уже 8 минут и не думает останавливаться.
Изменено: Счастливчик - 25.04.2024 17:26:49
 
Много времени занимает именно открытие файла и изменение параметров. После предлагает сохранить - и так на каждый файл. На 23 файлах мой код работает несколько минут. Вот я и спрашиваю, можно ли его как-то ускорить?
 
Добрый день.
В начале кода добавьте эту строку:
Application.PrintCommunication = False
а в конце:
Application.PrintCommunication = True

Чтобы ускорить открытие книг,  сохраняйте их при Вид - Обычный, а не Страничный/Разметка
Можете еще перед загрузкой выбрать виртуальный принтер
Изменено: ZVI - 25.04.2024 20:40:05
 
Цитата
ZVI написал:
В начале кода добавьте эту строку:Application.PrintCommunication = Falseа в конце:Application.PrintCommunication = True
Добавил - код перестал работать  :cry: То есть, код вроде бы что-то делает, но параметры печати не меняются. И окна с вопросом сохранить или нет не появляется, хотя без него файл НЕ сохраняется.
Цитата
ZVI написал:
Чтобы ускорить открытие книг,  сохраняйте их при Вид - Обычный, а не Страничный/РазметкаМожете еще перед загрузкой выбрать виртуальный принтер
Подскажите, пожалуйста, как всё это сделать?
 
Цитата
Счастливчик: Добавил - код перестал работать
Цитата
ZVI: В начале кода добавьте эту строку:
ну, голову-то тоже не стоит выключать  :D Владимир имел в виду в начале/конце кода ВЫСТАВЛЕНИЯ ПАРАМЕТРОВ ПЕЧАТИ.
Цитата
Счастливчик: Подскажите, пожалуйста, как всё это сделать?
Вид — это кнопочки в правом нижнем углу перед ползунком масштаба. Их 3 и вам нужна первая/левая. Изменение вида и выбор принтера можете записать макрорекордером.
Изменено: Jack Famous - 26.04.2024 09:58:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Владимир имел в виду в начале/конце кода ВЫСТАВЛЕНИЯ ПАРАМЕТРОВ ПЕЧАТИ
Огромнейшее спасибо. Ещё добавил в начале и конце цикла For N (в конце - перед Metka:) отключение обновления экрана, взяв эту идею у lost.eu. Вроде шустро стал работать. Ещё раз, огромнейшее спасибо!
Цитата
Jack Famous написал:
ну, голову-то тоже не стоит выключать  
Ну, для этого нужно иметь хорошие знания в области макросов, а я их знаю не очень хорошо, и, например, на каком этапе кода следует вставлять отключение обновления экрана или вставить строку, предложенную ZVI, я не очень понимаю  :(
 
Цитата
Счастливчик: для этого нужно иметь хорошие знания в области макросов
достаточно нормально описать проблему. Вы создали тему Как ускорить код, задающий параметры печати и пишете Есть код, задающий параметры печати, но, при этом, приводите ВЕСЬ листинг с кучей строк, НИКАК не относящихся к параметрам печати.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Счастливчик написал:
код перестал работать
Ну это никак не может быть связано с тем, что я советовал.
Может, что-то не так добавили или зацепили.
Чтобы найти проблему нужно закомментировать On Error Resume  Next и отладить код, например, построчно, нажимая F8.
Глядя на код было впечатление, что о VBA и отладке какое-то представление имеется.
Как уточнил  Алексей (Jack Famous), рекомендованные строчки правильнее вставлять до  и после цикла For-Next, так как ранее есть выходы из кода по Exit Sub, хотя это для данного кода не критично.

Цитата
Подскажите, пожалуйста, как всё это сделать?
"Вид - Обычный, а не Страничный/Разметка" означает вкладку Вид на ленте:
Изменено: ZVI - 27.04.2024 01:42:55
 
Jack Famous,
И какие же строки не относятся к параметры рам печатм
Проблема - оптимизировать код, который я привёл. Конечная задача кода - пройтись по файлам в папке и настроить им параметры печати. И я не понимаю, чего не хватает в описании задачи. Объясните, пожалуйста.
Цитата
ZVI написал:
Ну это никак не может быть связано с тем, что я советовал.Может, что-то не так добавили или зацепили.
Дело в том, что код перестал работать, когда я добавил указанн Вами строки вначале кода после Sub и в конце перед End Sub. А вот когда я добавил их вначале цикла с установкой параметров печати сразу после For и в конце этого цикла непосредственно перед Next, код снова заработал, причём гораздо шустрее.
Изменено: Счастливчик - 27.04.2024 13:17:02
 
Закомменипованное - лишние строки, это опции, имеющие заданные значения по умолчанию
Код
            With Sht.PageSetup
'                .LeftHeader = ""
'                .CenterHeader = ""
'                .RightHeader = ""
'                .LeftFooter = ""
'                .CenterFooter = ""
'                .RightFooter = ""
                .LeftMargin = Application.InchesToPoints(0.393700787401575) '28,3464566929134
                .RightMargin = Application.InchesToPoints(0.393700787401575)
                .TopMargin = Application.InchesToPoints(0.393700787401575)
                .BottomMargin = Application.InchesToPoints(0.393700787401575)
                .HeaderMargin = 0 'Application.InchesToPoints(0)
                .FooterMargin = 0 'Application.InchesToPoints(0)
'                .PrintHeadings = False
'                .PrintGridlines = False
'                .PrintComments = xlPrintNoComments
                .PrintQuality = 600
'                .CenterHorizontally = False
'                .CenterVertically = False
'                .Orientation = xlPortrait
'                .Draft = False
'                .PaperSize = xlPaperA4
'                .FirstPageNumber = xlAutomatic
                .Order = xlOverThenDown
'                .BlackAndWhite = False
                .Zoom = False
'                .FitToPagesWide = 1
                .FitToPagesTall = False
'                .PrintErrors = xlPrintErrorsDisplayed
'                .OddAndEvenPagesHeaderFooter = False
'                .DifferentFirstPageHeaderFooter = False
'                .ScaleWithDocHeaderFooter = True
                .AlignMarginsHeaderFooter = False
'                .EvenPage.LeftHeader.Text = ""
'                .EvenPage.CenterHeader.Text = ""
'                .EvenPage.RightHeader.Text = ""
'                .EvenPage.LeftFooter.Text = ""
'                .EvenPage.CenterFooter.Text = ""
'                .EvenPage.RightFooter.Text = ""
'                .FirstPage.LeftHeader.Text = ""
'                .EvenPage.CenterHeader.Text = ""
'                .FirstPage.RightHeader.Text = ""
'                .FirstPage.LeftFooter.Text = ""
'                .FirstPage.CenterFooter.Text = ""
            End With
 
testuser, твоё утверждение может быть верно для СОЗДАВАЕМЫХ файлов. А, насколько я понял (могу ошибаться), ТС меняет параметры СУЩЕСТВУЮЩИХ файлов, в которых могут стоять самые различные параметры печати.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
testuser, Jack Famous,
Если честно, у меня всегда по умолчанию стоит альбомный формат. А мне как раз и нужно присвоить книжный формат и уместить всё на одну страницу.
Какие тогда строчки из кода постом выше можно закомментировать/удалить? И ускорит ли это код? И можно ли, всё-таки, как-то ускорить открытие файлов?
 
Вариант времён царя Гороха с почившего в бозе сайта...
Код
'http://www.sql.ru/forum/actualthread.aspx?tid=368044
'Как оптимизировать следующий код (установка параметров страницы) Excel?
With ActiveSheet.PageSetup
.RightFooter = "Страница &P из &N"
.LeftMargin = Application.InchesToPoints(0.196850393700787)
.RightMargin = Application.InchesToPoints(0.196850393700787)
.TopMargin = Application.InchesToPoints(0.393700787401575)
.BottomMargin = Application.InchesToPoints(0.590551181102362)
.HeaderMargin = Application.InchesToPoints(0.511811023622047)
.FooterMargin = Application.InchesToPoints(0.31496062992126)
.CenterHorizontally = True
.Orientation = xlLandscape
End With

'уж очень долго выполняется!

'Сделал так:
Dim Prn As String, a
a = Timer
Prn = "PAGE.SETUP( , ""&RСтраница &P из &N"", 0.19, 0.19, 0.19, 0.19, 0, False, True, False, 2, 9, , 1, 1,False, , 0.19, 0.38, False)"
Application.ExecuteExcel4Macro Prn
MsgBox Timer - a
 
tolikt,
Не понял, это в место моего кода? А таймер - для замеров? А открытие файлов это ускорит? Его ведь тоже хотелось бы ускорить.
 
Цитата
Счастливчик написал: Не понял, это вместо моего кода?  А открытие файлов это ускорит?...
Вы иронизируете или правда не понимаете код? Это не готовое решение, а чей-то пример использования метода, альтертативного Application.PrintCommunication, который применяли давно до появления PrintCommunication.
Ответ по ускорению открытия файлов был в сообщении #7:
Цитата
ZVI написал: ... перед загрузкой выбрать виртуальный принтер
Виртуальный принтер - это чисто программный принтер без физического железа. Обычно используется для записи (распечатки) в файл.  Вот 2 виртуальных принтера, которые использует Excel:
 
Эти картинки можно увидеть из Excel на ленте Файл - Печать, или при нажатии Ctrl-P.
Выберите вручную один из этих принтеров до запуска кода.
Если эффект будет, то активный принтер устанавливается и программно (это отдельный вопрос).
Изменено: ZVI - 27.04.2024 23:44:47
 
Цитата
ZVI написал:
Вы иронизируете или правда не понимаете? Это не готовое решение, а метод, альтертативный Application.PrintCommunication, который использовали до появления PrintCommunication.
Я в этих методах не разбираюсь. Покажите, пожалуйста, как будет выглядеть мой код с использованием этого метода?
Мне нужно потом печать обработанные кодом файлы на определённый принтер. Так что вряд ли такой метод удобен. И на одном файле я вряд ли увижу, выгоден ли он или нет, а заходить в каждый файл и ставить его там - это конечно не вариант. А можно как-то сам код оптимизировать кроме того, что уже улучшено, чтобы он быстрее работал?
Изменено: Счастливчик - 27.04.2024 23:47:16
 
Цитата
Счастливчик написал: ...Покажите, пожалуйста, как будет выглядеть мой код с использованием этого метода?
Зачем? Я же в #7 привел Вам нормальный современный код, который дает тот же эффект, и пояснил это в #19.
Цитата
Счастливчик написал:...чтобы он быстрее работал
См. про виртуальный принтер в #19.
Цитата
заходить в каждый файл и ставить его там - это конечно не вариант.
Такое никто не предлагал же
Изменено: ZVI - 28.04.2024 00:15:56
 
Цитата
ZVI написал:
Такое никто не предлагал же
Так а как тогда настроить в файлах виртуальный принтер? Или я не так понимаю Ваше предложение по его использованию?
 
Судя по вопросам и комментариям, в VBA у Вас особого опыта нет.
Ничего страшного, но лучше об этом явно написать, чтобы сэкономить всем время
А то мы советы даем в расчете на навыки в VBA.
Тогда описать  проблему можно было бы так:
Здравствуйте!
У меня есть папка с файлами XLS.
Хотелось бы выбрать в диалоге эту папку, а затем поочередно открывать книги в ней, и в параметрах страницы каждого (?) листа  устанавливать книжную ориентацию и разместить не более, чем на 1 страницу в ширину (и 1 (?) страницу в высоту).
Другие параметры страниц не менять(?).
После этого нужно автоматически их сохранить и закрыть.
Спрашивать о необходимости сохранения изменений - это лишнее (?).
Использую приложенный медленный код. Он написан с использованием макрорекордера (?).
Открытие книг и установка параметров страницы тормозит: 23 файла обрабатываются несколько  минут.
Принтер - сетевой (?).
C VBA опыта немного, самостоятельно оптимизировать код не получается.
Помогите, пожалуйста, с вариантом кода для ускорения обработки
.


Там, где (?) - нужно уточнить.
Изменено: ZVI - 28.04.2024 05:41:06
 
Цитата
Счастливчик написал: Так а как тогда настроить в файлах виртуальный принтер?
Цитата из #19:
Цитата
ZVI написал:
Выберите вручную один из этих принтеров до запуска кода. Если эффект будет, то активный принтер устанавливается и программно (это отдельный вопрос)
Вы проверили, есть эффект?
Выбранный вручную (или программно) активный принтер устанавливается для всех файлов, открываемых в Excel.
Изменено: ZVI - 28.04.2024 01:27:20
 
Цитата
Счастливчик написал: А можно как-то сам код оптимизировать кроме того, что уже улучшено, чтобы он быстрее работал?
Проверяйте:
Код
Изменено: ZVI - 28.04.2024 06:23:23
 
ZVI, спасибо, взял себе на всякий случай. :)  
 
Цитата
cuprum написал: ZVI , спасибо, взял себе на всякий случай.
Доброе утро! Конечно, надеюсь, пригодится  :)
В коде можно поменять *XPS* на *PDF* или название другого принтера, если нужно.
 
ZVI,
Огромнейшее спасибо!
Цитата
ZVI написал:
Вы проверили, есть эффект?
К сожалению, проверить смогу уже только 02 мая.
Цитата
ZVI написал:
Выбранный вручную (или программно) активный принтер устанавливается для всех файлов, открываемых в Excel
А вот этого я не знал.
Огромнейшее спасибо за помощь!
 
Цитата
ZVI написал:
Судя по вопросам и комментариям, в VBA у Вас особого опыта нет.
Ну практически так и есть. Я на уровне знаний английского понимаю команды в VBA: For i = 1 to 5 означает Для i с 1 до 5 выполняем в цикле следующее; paste означает вставить; formula - и в Африке формула; и т.п. Но в VBA есть ещё и объектная модель с разными объектами и методами, и вот она для меня - ТЁМНЫЙ ЛЕС! Ибо я ещё никогда не читал книг по VBA (ни Уокенбаха, ни других). Поэтому когда мне говорят название метода, который в моём конкретном вопросе можно использовать, мне это мало чем помогает. Простите, если из-за всех этих недосказанностей я Вас чем-то обременил и заставил потратить на себя лишнее время.
Изменено: Счастливчик - 28.04.2024 13:24:09
 
Цитата
ZVI написал:
Он написан с использованием макрорекордера (?).
Не совсем. Изначально это был код по поиску слов в файлах, который я взял с нашего форума. Из него я просто удалил в цикле по листам действия по поиску слов, и вставил записанный макрорекордером код по изменению параметров печати. Отсюда и рудиментарный ничего не делающий inputbox в коде.
Цитата
ZVI написал:
В коде можно поменять *XPS* на *PDF*
А как поменять? Просто поменять везде XPS на PDF?
Изменено: Счастливчик - 28.04.2024 13:30:40
Страницы: 1 2 След.
Наверх