Excel, Wordの自動操作のハードル削減計画・その6

~ Excelの印刷イメージをpdfにする ~

2020年6月13日

[はじめに]

 今回は Excelにおいて印刷イメージを整えることにチャレンジします。

 JuseOffice06.zipにサンプルが入っています。

 印刷用の環境がない場合を考えて、
印刷イメージは pdfとして書き出します。

 用紙サイズの調整、ページ番号の付加、1ページにおさめるための縮小、
スタイルや罫線の設定、セル内の文字配置にもふれます。

 JuseOfficeにはExcel用の印刷イメージ調整のサブルーチンを設けてありません。

 なので、VBAの記述に即した一般的な書き方になります。


[目次へ]

1. Excelファイルをpdfとして書き出す

 まずは単純なpdfファイルの書き出しについて述べます。

 Excelでも ExportAsFixedFormatメソッドを使います。

 Wordの場合と同じ名前のメソッドですが、
引数の順番や種類に違いがあります。

 他にもいろいろな引数がありますが、普通は上記二つで大丈夫だとおもいます。

 第2引数の「書き出すファイルの名前」を省略した場合、
test.xlsxをpdfとして書き出すなら test.pdf になります。

 ただし、ドキュメントフォルダに書き出されます。

 カレントフォルダに出力したいときは、パス名をつけて指定する必要があります。

 なお、ExportAsFixedFormatメソッドは
ワークブックにもワークシートにも適用できます。

[ワークブック].ExportAsFixedFormat xlTypePDF, "C:\work\test.pdf"
[ワークシート].ExportAsFixedFormat xlTypePDF, "C:\work\test.pdf"

 ワークブックに適用したときは、空でないワークシートを全部出力します。

 以下にサンプルスクリプト pdf01.wsf の主要部分を掲げます。

 都道府県別の人口・面積・人口密度(人口情報.xlsx)をpdfとして書き出します。

Include "const_xl.vbs"
sourceFile = "人口情報.xlsx"
pdfFile = FullPath("人口情報01.pdf")
[ワークブックを開く] sourceFile
[ワークブック].ExportAsFixedFormat xlTypePDF, pdfFile
[エクセルを終了]

[目次へ]

2. 用紙サイズおよび用紙の向きの指定

 用紙サイズおよび用紙の向きは、[ワークシート].PageSetup
PaperSize, Orientationふプロパティで指定します。

 なお、PageSetup は、ワークブックオブジェクトには適用できないので要注意。

 ワークシートごとに設定する必要があります。

(1) 用紙サイズ

 Excelでは用紙サイズを xlPaperA4(数値9)などの定数で指定します。

 Wordでは高さと幅をそれぞれ数値で指定しますが、Excelはそれとは違います。

 たとえば下のとおり。

[ワークシート].PageSetup.PaperSize = xlPaperA4

 A3, A4, A5, B4, B5, Letter などが指定可能です。

 そのほか、各種の封筒に対応しています。

 詳細は下記のサイトを参照してください。

PaperSize(用紙サイズ)プロパティの定数一覧表


(2) 用紙の向き

 用紙の向きを縦方向(縦長)にするか、横方向(横長)にするかの指定は
[ワークシート].PageSetup.Orientation = xlPortrait のように指定します。

 縦長は xlPortrait(数値1)、横長が xlLandscape(数値2)です。

 以下に用紙サイズ、用紙の向きを指定するサンプル pdf02.wsf を掲げます。

Include "const_xl.vbs"
sourceFile = "人口情報.xlsx"
pdfFile = FullPath("人口情報02.pdf")
[ワークブックを開く] sourceFile
With [ワークシート].PageSetup
    .PaperSize = xlPaperA5
    .Orientation = xlLandscape
End With
[ワークシート].ExportAsFixedFormat xlTypePDF, pdfFile
[エクセルを終了]

[目次へ]

3. 拡大・縮小の指定

 Excelでは印刷イメージの拡大・縮小が簡単に行えます。

 [ワークシート].PageSetup.Zoom = 50 とすれば50%(縮小)になります。

 Zoomの数値は 10~400の範囲で指定できるようです。

 また、ワークシート全体を1ページにおさめたいという場合は
倍率を指定するのでなく別の方法を使います。

 たとえば下のとおり。

With [ワークシート].PageSetup
    .Zoom = False          ' 拡大・縮小率を指定しない 
    .FitToPagesTall = 1    ' 縦方向1ページで印刷 
    .FitToPagesWide = 1    ' 横方向1ページで印刷 
End With

 以下に都道府県別の人口等を1ページにおさめてpdfにする pdf03.wsf を掲げます。

Include "const_xl.vbs"
sourceFile = "人口情報.xlsx"
pdfFile = FullPath("人口情報03.pdf")
[ワークブックを開く] sourceFile
With [ワークシート].PageSetup
    .PaperSize = xlPaperA4
    .Orientation = xlPortrait
    .Zoom = False          ' 拡大・縮小率を指定しない 
    .FitToPagesTall = 1    ' 縦方向1ページで印刷 
    .FitToPagesWide = 1    ' 横方向1ページで印刷 
End With
[ワークシート].ExportAsFixedFormat xlTypePDF, pdfFile
[エクセルを終了]

[目次へ]

4. フッターにページ番号を付加

 Excelでヘッダー・フッターを設定する方法については下のサイトが参考になります。

エクセルVBAで印刷時のヘッダー・フッターの設定をする方法と書式コード・VBAコード一覧

 詳細は上記のサイトをみていただくとして、
フッターの中央に「1/4」のようなページ番号を付けるなら下のとおり。

[ワークシート].PageSetup.CenterFooter = "&P/&N"

 &P がページ番号、&N が総ページ数に置き換えられます。

 PageSetupに帰属する次のプロパティがヘッダー・フッターに関するものです。

 LeftHeader, CenterHeader, RightHeader
 LeftFooter, CenterFooter, RightFooter

 それぞれ左・中央・右のヘッダーおよびフッターに関するプロパティです。

 値として "&P/&N" などの文字列をセットします。

 文字列の中でアンド記号が特別の意味を持ちます。

 &P, &N の他に、
&D 現在の日付、&T 現在時刻、
&F ファイル名、&A ワークシート名などがあります。

 斜体、下線、フォントなどの指定も可能です。

 その辺の詳しい説明は上記サイトに解説があります。

 以下にフッターの中央にページ番号を付加する pdf04.wsf を掲げます。

Include "const_xl.vbs"
sourceFile = "人口情報.xlsx"
pdfFile = FullPath("人口情報04.pdf")
[ワークブックを開く] sourceFile
With [ワークシート].PageSetup
    .PaperSize = xlPaperA4
    .Orientation = xlPortrait
    .Zoom = False          ' 拡大・縮小率を指定しない 
    .FitToPagesTall = 2    ' 縦方向2ページで印刷 
    .FitToPagesWide = 1    ' 横方向1ページで印刷 
    For Each prop1 In Split(".Left .Center .Right")
        For Each prop2 In Split("Header Footer")
            Eval(prop1 & prop2 & " = """"")  ' .LeftHeader = "" など
        Next
    Next
    .CenterFooter = "&P/&N"
End With
[ワークシート].ExportAsFixedFormat xlTypePDF, pdfFile
[エクセルを終了]

 ヘッダーとフッターを念のため全消去して
その上でフッターの中央にページ番号を付加しています。

 ヘッダーとフッターのプロパティが六つもあるので
各々のプロパティを6行でずらずら書くのは面倒です。

 そこで、ForループとEvalを使って書いてみました。

 でも、結果的にはあまり行数の節約になってないですね(あせ)。

 なお、Eval は、引数としてわたされた文字列をスクリプトとして実行します。


[目次へ]

5. スタイル、文字の配置および罫線

 ExcelにもWordと同じようにスタイルというのがあります。

 ここでは、そのスタイルの設定方法、
セル内での文字の配置(左詰・中央そろえ・右詰)、
簡単な罫線の引き方を取り上げます。

(1) スタイル

 Excelの文字は、通常、ゴシック体・11ポイントだとおもいますが、
セルのスタイルを「見出し 1」にすると、ゴシック体・15ポイント・太字になります。

 「説明文」にすると、ゴシック体・11ポイントではありますが斜体になります。

 サンプルのpdf05.wsf では、
1行目:【都道府県別人口・面積・人口密度】を「見出し 1」
2行目:【(2019年10月1日現在)】を「説明文」のスタイルにします。

 該当箇所だけ示すと次のとおり。

With [ワークシート]
    .Range("A1").Style = "見出し 1"
    .Range("A2").Style = "説明文"
End With

 zipファイルに styles.wsf を入れてあります。

 実行すると、組み込まれているスタイルについて
スタイル名、フォント名、フォントのサイズ、太字、斜体、色、
背景色、背景の濃淡の8項目を出力します。

 40以上のスタイルが styles.xlsx に書き出されます。

 各行が該当のスタイルに設定されるので、見える人には一目瞭然だとおもいます。

 色は ColorIndex(数値1~56)を使っています。

 スタイル名として「良い」 「どちらでもない」 「悪い」がありますが、
アンケートの回答としてこの三択があるときに、
それぞれ該当のスタイルを適用すれば
見た目にわかりやすくなる、ということなんでしょうね。


(2) セル内の文字配置とデータ型のチェック

 「人口情報.xlsx」には人口、面積、人口密度という数値のデータがあります。

 それら数値データを右詰にします。

 左右バランスでの文字配置は HorizontalAlignment で行います。

 セルA1の文字配置を右詰にするなら次のとおり。

.Range("A1").HorizontalAlignment = xlRight

 設定できる値は下のとおり。

定数名 数値 配置
xlLeft -4131 左詰め
xlCenter -4108 中央揃え
xlRight -4152 右詰め
xlJustify -4130 両端揃え
xlDistributed -4117 均等割り付け
xlGeneral 1 標準(デフォルト)
xlFill 5 繰り返し
xlCenterAcrossSelection 7 選択範囲内で中央

 一方、上下バランスでの配置は VerticalAlignment で行います。

 設定できる値は下のとおり。

定数名 数値 配置
xlTop -4160 上詰め
xlCenter -4108 中央揃え(デフォルト)
xlBottom -4107 下詰め
xlJustify -4130 両端揃え
xlDistributed -4117 均等割り付け
xlFill 5 繰り返し

 ところで、右詰にしたいのは数値型です。文字型は変更しません。

 あるセルが数値型かどうかは VarType関数で確認できます。

typeVal = VarType(.Range("A1").Value)

 上のようにすれば A1セルのデータ型が変数 typeVal に代入されます。

 typeValが vbDouble(数値5)だと数値型、vbString(数値8)であれば文字型です。

 細かく言うと、typeVal には次のような数値が入るようですが、
Excelでは短い整数値でも vbDouble(数値5)になるようです。

定数名 数値 配置
vbEmpty 0 Empty値(未初期化)
vbNull 1 Null値(無効な値)
vbInteger 2 整数型(Integer)
vbLong 3 長整数型(Long)
vbSingle 4 単精度浮動小数点数型(Single)
vbDouble 5 倍精度浮動小数点数型(Double)
vbCurrency 6 通貨型(Currency)
vbDate 7 日付型(Date)
vbString 8 文字列型(String)
vbObject 9 オブジェクト
vbError 10 エラー値
vbBoolean 11 ブール型(Boolean)
vbVariant 12 バリアント型(Variant)
vbDataObject 13 非OLE
vbDecimal 14 10進数型
vbByte 17 バイト型(Byte)
vbUserDefinedType 36 ユーザー定義型を含むバリアント型
vbArray 8192 配列

 なお、TypeName関数でもデータ型を確認できます。

 オブジェクト型の場合(たとえばワークブック、ワークシートなど)
TypeName関数は "Workbook", "Worksheet" などを返してくれます。


(3) 罫線

 該当箇所(たとえば A1:C3)に実線の格子罫線を引き、
外枠罫線を太い実線にするには次のようにします。

Set rng = [ワークシート].Range("A1:C3")
rng.Borders.LineStyle = xlContinuous  ' 該当セル全部に実線罫線
rng.BorderAround xlContinuous, xlThick  ' 外枠を太い実線罫線に

 罫線にかかわる LineStyleプロパティは線の種類を指定するためのものです。

 xlContinuous(数値1, 実線)のほか、xlDot(数値-4118, 点線)などもあります。

 xlLineStyleNone(数値-4142, 線なし)を指定すると罫線が消えます。

 ケイ線の太さを指定するための Weightプロパティもあります。

 xlMedium(数値-4138, 普通)、xlThick(数値4, 太線)などがあります。

 外枠罫線を引くための BorderAroundメソッドは
第1引数が LineStyle(種類)、第1引数は Weight(太さ)です。


(4) サンプルスクリプト

 スタイル、文字配置、罫線を調整するスクリプト pdf05.wsf を掲げます。

 人口情報05.pdf のほかに、念のため pdf05.xlsx も出力します。

Include "const_xl.vbs"
sourceFile = "人口情報.xlsx"
pdfFile = FullPath("人口情報05.pdf")
excelFile = "pdf05.xlsx"
[ワークブックを開く] sourceFile
With [ワークシート].PageSetup
    .PaperSize = xlPaperA4
    .Orientation = xlPortrait
    .Zoom = 75
End With
With [ワークシート]
    .Range("A1").Style = "見出し 1"
    .Range("A2").Style = "説明文"
    rowFirst = .UsedRange.Find("北海道").Row
    rowLast = [末尾のセル].Row
    For col = 1 To 7  ' 1~7列をチェック
        typeVal = VarType( .Cells(rowFirst, col).Value )  ' セルのデータ型
        If typeVal = vbDouble Then  ' 数値データである場合
            .Range(.Cells(rowFirst, col), .Cells(rowLast, col)) _
                .HorizontalAlignment = xlRight
        End If
    Next
    Set rng = .Range(.UsedRange.Find("都道府県"), [末尾のセル])
    rng.Borders.LineStyle = xlContinuous  ' 該当セル全部に実線罫線
    rng.BorderAround xlContinuous, xlThick  ' 外枠を太い実線罫線に
    .ExportAsFixedFormat xlTypePDF, pdfFile
End With
[ワークブックを別名で保存] excelFile
[エクセルを終了]

~ 以上 ~

Copyright (C) T. Yoshiizumi, 2020 All rights reserved.