Excel VBA无法正确导出页面设置到PDF

6
我有一段代码,可以将工作表格式化为所需的设置和布局(以横向一页为宽度和高度)。当我运行代码(作为长宏的一部分)时,它会正确地格式化页面设置。
如果我手动将其导出并保存为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

我能看一下格式化工作表到所需布局的代码吗?因为我刚刚尝试了您的代码,通过将我拥有的一个工作表更改为横向等方式,我能够完全按照我更改的方式保存PDF。 - CaptainABC
@CaptainABC,我已经添加了你要求的代码。感谢您查看这个! - rohrl77
感谢您发布其余的代码。我已经添加了一个答案。 - CaptainABC
3个回答

5
我找到了似乎是解决方案:

我发现了一个看起来是解决方案的东西:

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会覆盖我设置的设置。


4
我认为问题在于您需要将.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


我尝试了一下,现在我的打印预览和PDF导出都可以跨多个页面了。至少它们现在匹配了 :-) ...但是不幸的是,它还没有完全工作。 - rohrl77
1
奇怪的行为仍在继续...如果我使用F8逐步执行页面格式化代码,然后使用F5运行其余部分,结果就会达到预期。 ?!? 但是,仅一次性运行宏会带回不良行为。 - rohrl77
我尝试添加FitToPagesTall但是它提供相同的结果。 - rohrl77
1
@rohrl77 这很奇怪 :( 我这边运行正常。好的,请尝试添加一个子程序 Private Sub Run(),然后在其中放置Call CreateNewReportCall SaveAsPDF。现在尝试运行创建的子程序。 - CaptainABC
@rohrl77 是的!你的代码中有一些问题导致它不能正确工作。但是 PageSetupSaveAsPDF 代码是没有问题的,因为它们可以正常运行。话虽如此,如果没有在你的实际文件上尝试它,那么让我进一步协助可能会比较困难。 - CaptainABC
显示剩余5条评论

2
是的!!!我也遇到了同样的问题:我无法导出已应用页面设置设置的工作表。
在尝试Application.PrintCommunication之前,我测试了Wait和Sleep命令,但没有成功。最终,我通过使用CopyPicture方法、添加图表页,然后将其导出为pdf来跳过此问题,但我的pdf分辨率不好,我无法调整页边距。
所以,在您的代码中的pagesetup设置之前添加Application.PrintCommunication=false,就像CaptainABC说的那样,最重要的是:在代码后关闭Application.PrintCommunication=true。
感谢您发布这篇有用的文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接