みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
前回、エクセルVBAでPDF出力する方法と出力の際に1ページに収めて出力する方法についてお伝えしました。
ただちょっと配置が左にちょっとずれていたんですよね…
エクセルVBAでは前回も登場したPageSetupオブジェクトを使うことでPDF出力や印刷の際の様々な設定を行うことができます。
今回は、エクセルVBAで印刷設定をページ中央配置にする方法、また上下左右のマージンを設定する方法についてお伝えしたいと思います。
また、プレビューの表示の仕方にも触れますよ。
どうぞよろしくお願いいたします!
前回のおさらい:シートを1ページに収めてPDF出力をする
前回のおさらいですが、シートを1ページに収めてPDF出力をするプログラムはこちらです。
Sub outputPDF()
Dim fileName As String '保存先フォルダパス&ファイル名
fileName = ThisWorkbook.Path & "\201603請求書_株式会社ホゲホゲ御中.pdf"
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName
End Sub
アクティブシートに対して、5行目~11行目で1ページ内に収める設定をしつつ、13行目で指定したファイル名でPDF出力をしています。
しかしお題のシートに対してプログラムを実行をすると
このようにちょっと左に寄った状態で出力されてしまいます。
今回はこれを解決していきたいと思います。
印刷プレビューを表示する
まずその前に、実行のたびに出力されたPDFを開いて結果を確認するのが、ほんの少し面倒なので、印刷プレビューを使いたいと思います。
エクセルVBAで特定のシートの印刷プレビューを表示したいときは
WorkSheetオブジェクト.PrintPreview
を使います。
お題のプログラムの13行目について
ActiveSheet.PrintPreview
'ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName '選択したシートをPDF出力
として実行をしますと
このようにプレビュー画面が表示されます。
これでチェックが楽ちんになりますね。
印刷出力設定を中央配置にする
エクセルVBAで印刷の出力設定をする場合はシートのPageSetupオブジェクトを使います。
その中でも、印刷をページの水平方向または垂直方向で中央に設定する場合はそれぞれ
WorkSheetオブジェクト.PageSetup.CenterHorizontally = True または False
WorkSheetオブジェクト.PageSetup.CenterVertically = True または False
というプロパティを使います。
Trueにすればそれぞれの方向についての中央配置となります。
これはエクセルの「印刷」→「ページ設定」→「余白」タブからページ中央のチェックボックスにチェックを入れた状態と同じです。
例えば先ほどのプログラムのPageSetupの設定ですが、Withのブロック内に
.CenterHorizontally = True
を追加しますと
このようにバッチリ水平方向の中央配置となります。
印刷の上下左右とヘッダー・フッターの余白を設定する
先ほどのプレビューなのですが、上下のマージンをもう少し小さくしてもいいかも知れませんね。
その前にエクセルの余白について簡単に説明をしておきたいと思います。
エクセルの余白は上下左右以外にヘッダーとフッターがあり、全部で6箇所設定が可能です。
ヘッダー、フッターはどこを指しているかというと、以下の図のようにヘッター領域(またはフッター領域)までの距離を指定します。
上、下はそれぞれ印刷用紙の上端、下端からシート内の印刷範囲で設定されているエリアまでの距離となります。
今回の場合、上下左右を今の半分くらいにしても良いかなという感じですね。
さて、エクセルVBAで印刷出力時の上下左右そしてヘッダーとフッターのマージン設定をする場合はそれぞれ
WorkSheetオブジェクト.PageSetup.TopMargin = 上余白(pt)
WorkSheetオブジェクト.PageSetup.BottomMargin = 下余白(pt)
WorkSheetオブジェクト.PageSetup.LeftMargin = 左余白(pt)
WorkSheetオブジェクト.PageSetup.RightMargin = 右余白(pt)
WorkSheetオブジェクト.PageSetup.HeaderMargin = ヘッダー余白(pt)
WorkSheetオブジェクト.PageSetup.FooterMargin = フッター余白(pt)
と設定します。
では試しに上下のマージンをそれぞれ1に設定してみましょう。
PageSetupの設定のWithのブロック内に
.TopMargin = 1
.BottomMargin = 1
を追加して実行してみましょう。
おや…?思ったよりも窮屈になってしまいましたね。
長さの単位をセンチメートルからポイントに変換
実は設定の単位が良くありません。
PageSetupオブジェクトへのマージン設定の単位はポイント(pt)ですが、エクセルの「印刷」→「ページ設定」で開くウィンドウで設定する単位はセンチメートル(cm)なのです。
こういう場合は、センチメートルからポイントに単位を変更するCentimetersToPointsメソッドを使います。
Application.CentimetersToPoints(センチメートル)
上下の余白を
.TopMargin = Application.CentimetersToPoints(1)
.BottomMargin = Application.CentimetersToPoints(1)
に変更をして実行してみます。
ちょうど良いマージンになりました。
まとめ
エクセルVBAで印刷設定をページ中央配置にする方法と上下左右のマージンを設定する方法についてお伝えしました。
全部PageSetupオブジェクトで設定できるのでわかりやすいですね。ちょっとプロパティの数は多いですが…
また、PrintPreviewメソッドによるプレビューの表示の仕方についてもお伝えしました。
本番のプログラムでは使わないと思いますが、デバッグなど開発途中では便利そうですよね。
次回は、印刷範囲の設定をする方法とクリアする方法についてお伝えできればと思います。
どうぞお楽しみに!