web-dev-qa-db-ja.com

エクセルvbaがpagesetupをpdfに正しくエクスポートしない

ワークシートを目的のセットアップとレイアウト(横向きで幅と高さが1ページ)にフォーマットするコードがあります。コード(長いマクロの一部)を実行すると、ページ設定が正しくフォーマットされます。

手動でエクスポートしてPDFとして保存すると、正しいページ設定が使用され、横向きの1ページが生成されます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
5
rohrl77

私は解決策と思われるものを見つけました:

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を使用せずにコードを実行すると、Excelが設定した設定を上書きしてしまいます。

4
rohrl77

問題は、ページ設定コードに_.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

4
CaptainABC

はい!!!、同じ問題が発生しました。ページ設定設定が既に適用されているシートをエクスポートできませんでした。

Application.PrintCommunicationを試す前に、WaitコマンドとSleepコマンドをテストしましたが成功しませんでした。最後に、CopyPictureメソッドを使用してこの問題をスキップし、グラフページを追加してからpdfにエクスポートしましたが、pdfでの解像度がうまくいかず、余白で遊ぶことができませんでした。

したがって、コードの前にApplication.PrintCommunication = falseを追加するだけで、CaptainABCが言うように、最も重要なページ設定設定で、コードの後に​​Application.PrintCommunication = trueで閉じます。

この便利な投稿をありがとうございます。

2
Chema Vascuence