AutoIt ExcelからPDFを出力する VBAのサンプルとの比較

autoit,vbaサンプルを見てエクセルからPDF出力 Excel

筆者は普段はgoogleスプレッドシート+GAS+Webを使っています。普段はほとんどエクセル使いません・・が、周りは結構エクセルを使って請求書などを作成しています。で、送る時はPDFにしたりしているのを見て、エクセル->PDF保存という需要がそれなりにあると思い、記事作成。

スポンサーリンク

1. VBAのサンプルをググる

AutoItはVBAの書き方をほぼコピペ出来るので、AutoItで検索せず、VBAキーワードでググります。下記サイトが見つかりました。お、複数ページのをスクリプトで拡大縮小するサンプルも載っていますね。いいですね。

初心者でも簡単!エクセルVBAでPDFを出力する最もシンプルなプログラム
エクセルVBAではPDF形式での出力もできます。今回は、初心者向けエクセルVBAでPDFを出力する最も簡単なプログラムと、PDF出力の際にシート1ページに収めて出力する方法についてお伝えしていきます。

1.1 請求書エクセルファイルのサンプルもダウンロード

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

請求書エクセルテンプレート_タテ型_001
どんなシーンにも利用できるブルー系のシンプルな縦型デザインで、どんな企業にも使いやすい定番の請求書です。色使いもシンプルなので、白黒印刷も対応可能です。

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 と定義されています。これは下記に定義されているものです。

XlFixedFormatType 列挙 (Excel)

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
autoitでVBAサンプルを見ながらExportAsFixedFormat()でPDF出力

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

ExportAsFixedFormat メソッド (Excel)

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ページになるエクセルが

autoit,vbaのようにpageSetupなしでExportAsFixedFormat()するとPDFが2ページになる。

フィットしました。

autoit vbaでほぼそのまま書ける。Pagesetupで1ページに収める。PDF出力

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

PageSetup オブジェクト (Excel)

コメント

タイトルとURLをコピーしました