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 после кода.

Спасибо за этот полезный пост.

Другие вопросы по тегам