筆者は普段はgoogleスプレッドシート+GAS+Webを使っています。普段はほとんどエクセル使いません・・が、周りは結構エクセルを使って請求書などを作成しています。で、送る時はPDFにしたりしているのを見て、エクセル->PDF保存という需要がそれなりにあると思い、記事作成。
1. VBAのサンプルをググる
AutoItはVBAの書き方をほぼコピペ出来るので、AutoItで検索せず、VBAキーワードでググります。下記サイトが見つかりました。お、複数ページのをスクリプトで拡大縮小するサンプルも載っていますね。いいですね。

1.1 請求書エクセルファイルのサンプルもダウンロード
請求書のサンプルもググってサンプルを探します。今回は下記のを使うことにします。ダウンロードボタンを押してダウンロードします。

2. ExportAsFixedFormat を使う
VBAでは、 ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName
AutoItでは、 ActiveSheet.ExportAsFixedFormat( $xlTypePDF, $fileName)とします。
VBAでの半角スペース=>( )、引数にそれぞれ変数をセットします。
このようにVBAのサンプルはちょっとした変換ルールさえ覚えれば簡単にAutoIt用にすることが出来ます。
2.1 VBAでのenumはAutoItでもそれなりに定義されている
例えばxlTypePDF=0なのですが、AutoItではExcelConstants.au3でGlobal Const $xlTypePDF = 0 と定義されています。これは下記に定義されているものです。

enumなども xlTypePDF -> $xlTypePDF といったように先頭に$を付けてエラーにならなければ、*Constants.au3で定義されています。
3. VBAサンプルをAutoIt用に書いて実行してみる
前置きが長くなりましたが、VBAスクリプトをベースにAutoIt用に書き換えて実行してみます。
1.1でダウンロードした請求書エクセルファイルをスクリプトと同じ階層に置いて、実行してみます。スクリプトと同じ階層に請求書.pdfが出来ました。開いてみると、プリントプレビュー時と同じ感じで出来ていますね。
Sub outputPDF() Dim fileName As String '保存先フォルダパス&ファイル名 fileName = ThisWorkbook.Path & "\...pdf" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName
を以下のようにautoitで書きます。
#AutoIt3Wrapper_UseX64=y #include <Excel.au3> $openfilepath = @ScriptDir & "\001_請求書_タテ型.xlsx" Global $oe = _Excel_Open() Global $wbook = _Excel_BookOpen($oe, $openfilepath) Sleep(1000) outputPDF() Func outputPDF() $exportfilepath = @ScriptDit & "\請求書.pdf" $wbook.ActiveSheet.ExportAsFixedFormat($xlTypePDF, $exportfilepath) EndFunc

下記が関数リファレンス。

3.1 違うシートをPDF出力したい場合はSheets(選択するシート)
違うシートを出力したい時は、$sheet = $wbook.Sheets(2) でターゲットのシートオブジェクトを選択します。その$sheetに対してExportAsFixedFormat()すればOK。
というわけで、先ほどのエクセルを開き、請求書シートをコピーし、納品書シートにして、一番上の行も納品書とします。
outputPDF()内のExportAsFixedFormat()を以下のように変更し、2シート目となる納品書を出力するようにし、実行すると納品書シートがPDFとなります。
$sheet = $wbook.Sheets(2)
$sheet.ExportAsFixedFormat($xlTypePDF, $exportfilepath)
ちなみに$wbook.ExportAsFixedFormat()とすると、全シートをPDF出力することになるので、ターゲットとなるシートを取得してから、そのシートに対してPDF出力する癖をつけたほうがいいでしょう。
3.2 引数オプションでコントロール
引数はいろいろありますが、Type,FileNameで大体事足ります。下記はExportAsFixedFormat()の引数です。標準的な値にしたい場合はとりあえず0を入れておくと良いかもです。
- Type: $xlTypePDF(0)か$xlTypeXPS(1) 必須
- FileName: 保存するフルパス もしくはエクセルが保存する現在のパス
- Quality: スタンダード(0)か最小(1) ExcelConstantsに定義されていない
- IncludeDocProperties: ドキュメントプロパティを付与(True)、しない(False)
- IgnorePrintAreas: 印刷範囲を無視する(True)、しない(False)
- From: どのページから(シートではない)
- To: どのページまで。なければ最後のページまで
- OpenAfterPublish: 出力したら開く(True)、開かない(False)
- FixedFormatExtClassPtr: FixedFormatExtクラスのポインタ
4 PDF出力で2ページに分かれてしまう場合
参考にしているVBA記事で書いてある、2ページに分かれてしまう場合の対処法。
これもダウンロードした請求書.xlsxの納品書シートに行を複製して2ページになるようにしてやってみます。
もうSheet以下はvbaの書き方でほぼOKです。End Withのスペースは取ってEndWithとしてください。
With $sheet.PageSetup .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = 1 EndWith
このように2ページになるエクセルが

フィットしました。

PageSetupオブジェクトのプロパティは下記リファレンスにあります。

コメント