Excel VBA неправильно экспортирует набор страниц в PDF
У меня есть код, который форматирует лист с нужной настройкой и макетом (одна страница шириной и высотой в альбомной ориентации). Когда я запускаю код (часть длинного макроса), он правильно форматирует набор страниц.
Если я вручную экспортирую и сохраню его в формате PDF, тогда он использует правильную настройку страницы, создавая одностраничный PDF в альбомной ориентации. Тем не менее, тот же экспорт, выполненный VBA, создает PDF-файл длиной в несколько страниц и в портретной ориентации.
Я не могу понять, почему он это делает. Я пробовал различные решения, такие как выбор листа перед экспортом, но все безрезультатно.
Любая помощь приветствуется.
Код выглядит так:
Sub SaveAsPDF()
Sheets(ReportWsName).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
[SaveFolderPath] & "\" & ReportWsName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
End Sub
ОБНОВИТЬ:
Код, используемый для форматирования набора страниц (поскольку он довольно длинный, я только добавляю соответствующий раздел этого подпрограммы)
Private Sub CreateNewReport(ProvisionCode As String, TimeFrom As Date, TimeTo As Date)
... other code here...
'Format report to create the desired layout
With Worksheets(ReportWsName)
'Delete unnecessary data and format the rest
.Range("A:B,D:D,F:G,J:M,O:O,Q:S").Delete Shift:=xlToLeft
.Range("A:F").EntireColumn.AutoFit
.Range("C:C, E:F").ColumnWidth = 30
With .Range("G:G")
.ColumnWidth = 100
.WrapText = True
End With
'Insert standard formating header form Reporting template
.Rows("1:2").Insert
wsReportTemplate.Range("1:3").Copy .Range("A1")
.Range("A2") = "Notes Report for " & ProvisionCode & " (" & TimeFrom & " - " & TimeTo & ")"
'Insert standard formating footer form Reporting template
wsReportTemplate.Range("A6:G7").Copy .Range("A" & .UsedRange.Rows.Count + 2)
'Ensure all data is hard coded
.UsedRange.Value = .UsedRange.Value
'Format Print Area to one Page
With ActiveSheet.PageSetup
.PrintArea = Worksheets(ReportWsName).UsedRange
.Orientation = xlLandscape
.FitToPagesWide = 1
End With
End With
End Sub
3 ответа
Я нашел то, что кажется решением:
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.Orientation = xlLandscape
.Zoom = False
'.PrintArea = Worksheets(ReportWsName).UsedRange
.FitToPagesWide = 1
'.FitToPagesTall = 1
End With
Application.PrintCommunication = True
Мне нужно было добавить часть Application.PrintCommunication в уравнение. По какой-то причине Excel перезапишет настройки, которые я установил, если я запустил код без него.
Я думаю, что проблема в том, что вам нужно добавить .Zoom = False
на ваш код настройки страницы:
'Format Print Area to one Page
With ActiveSheet.PageSetup
.PrintArea = Worksheets(ReportWsName).UsedRange
.Orientation = xlLandscape
.FitToPagesWide = 1
.Zoom = False 'I have added this line
End With
Из того, что я пробовал, это должно решить для вас.
Дайте мне знать, как это происходит!
РЕДАКТИРОВАТЬ: Может быть, вам нужно:
'Format Print Area to one Page
With ActiveSheet.PageSetup
.PrintArea = Worksheets(ReportWsName).UsedRange
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.Zoom = False 'I have added this line
End With
EDIT2: Что делать, если вы изменили:
.PrintArea = Worksheets(ReportWsName).UsedRange
к
.PrintArea = Worksheets(ReportWsName).UsedRange.Address
Да, у меня возникла та же проблема: я не смог экспортировать лист с уже примененными к нему настройками страницы.
Перед тем, как попробовать Application.PrintCommunication, я безуспешно проверил команды Wait и Sleep. Наконец, я пропустил эту проблему, используя метод CopyPicture, добавив страницу с диаграммой, а затем экспортировав ее в pdf, но разрешение в моем pdf-файле было неудовлетворительным, и я не смог поиграть с полями.
Так что просто добавьте Application.PrintCommunication = false перед вашим кодом, в настройках страницы, таких как CaptainABC, и самое важное: закройте с Application.PrintCommunication=true после кода.
Спасибо за этот полезный пост.