ACCESS VBAでレポートをPDFに出力する方法

VBAでレポートをPDFに出力する方法

ACCEESSで作成したレポートは印刷以外にPDFで保存するという利用方法も一般的です。

通常は印刷プレビューで開いてからPDF保存しますが、VBAを使ってレポートを表示させずにPDF保存することも可能です。

今回は、VBAでレポートをPDFに出力する方法をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

DoCmd.OutputToメソッド

ACCESSのオブジェクトをPDFに保存する際に利用するのが、DoCmd.OutputToメソッドです。

以下の構文で利用します。

DoCmd.OutputTo 出力するACCESSオブジェクトの種類 , オブジェクト名 , 出力するファイル形式 , 出力先ファイルパス

他にも引数はありますが、基本はこれだけ覚えておけば十分でしょう。

一つ目の引数である出力するACCESSオブジェクトの種類は以下のパラメータがあります。

acOutputTableテーブル
acOutputQueryクエリ
acOutputFormフォーム
acOutputReportレポート
acOutputFunctionユーザー定義プロシージャ
acOutputModuleモジュール

ほかにもありますが、実際に利用するのは上記くらいでしょう。今回はレポートのPDF出力ですので、acOutputReportを使用します。

また、3つ目の引数である出力するファイル形式は、acFormatの後ろにファイル形式を記述する形になります。

PDF出力の場合は、acFormatPDFと記述します。

完成系

では、DoCmd.OutputToを使ったレポートのPDF保存の完成系を示します。

下記は請求書の発行画面です。

右下に「PDF保存」のボタンを作ってあります。このボタンを押すと、ACCESSファイルがあるディレクトリに、指定したレコードの請求書をPDFで出力します。

イベントプロシージャの設定

では、作り方です。
まずは上記のフォームをデザインビューで表示します。

フォームのデザインビュー

デザインビューで表示すると、PDF保存ボタンのクリック時イベントにイベントプロシージャを設定してあります。

このイベントプロシージャにVBAでDoCmd.OutputToを使ったPDF出力機能を設定してあります。

VBAプログラミング

では、VBAのコードを見てみましょう。
フォームのPDF保存ボタンのクリック時イベントに下記のイベントプロシージャを設定してあります。


 Private Sub PDF保存_ボタン_Click()

    DoCmd.OpenReport "請求書", acViewPreview, , "請求ID = " & Me!請求ID, acHidden

    DoCmd.OutputTo acOutputReport, "請求書", acFormatPDF, Left(CurrentDb.Name, InStrRev(CurrentDb.Name, "\")) & "請求書" & Me!請求ID & ".pdf"

    DoCmd.Close acReport, "請求書"

 End Sub
 

DoCmd.OutputToメソッドを使って、PDFに出力するコードです。

対象レコードの指定

今回はDoCmd.OutputToを利用するのですが、引数をよく見ていただくとDoCmd.OutputToには対象レコードの指定をする引数がないことが分かると思います。

そうです。
DoCmd.OutputToで出力すると対象のオブジェクトが全レコード出力されてしまうのです。

今回の例で言えば作成された請求書データすべてをPDF出力してしまいます。

それを回避するために、DoCmd.OutputToの前にDoCmd.OpenReportで請求IDを指定して請求書レポートを開いています。


 DoCmd.OpenReport "請求書", acViewPreview, , "請求ID = " & Me!請求ID, acHidden
 

こうすることで指定したIDのレポートのみをPDF出力することが可能です。

この請求書レポートの表示処理は単にIDを指定するためだけなのでユーザーには請求書レポートが見える必要がありません。
そこで、DoComd.OpemReportの最後の引数に「acHidden」を指定して、非表示状態でレポートを開くようにしています。

そして、DoCmd.OutputToが終わった後で


 DoCmd.Close acReport, "請求書"
 

で請求書レポートを閉じています。

DoCmd.OutputToの引数

次に本題のDoCmd.OutputToの引数です。

一つ目の引数に「acOutputReport」を設定することで、ACCESS内にあるレポートを出力することを指定しています。

二つ目の引数は”請求書”にしていますが、これはACCESS内に「請求書」という名前のレポートを事前に作っており、それを出力するということです。

三つ目の引数が「acFormatPDF」でPDFで出力する指定をしていますね。

出力ファイルパスの指定

四つ目の引数は少し複雑ですが、出力するファイルパスを設定しています。


 Left(CurrentDb.Name, InStrRev(CurrentDb.Name, "\"))
 

は現在のACCESSファイルがあるディレクトリ名をテキストとして取得しています。

CurrentDb.Nameは現在のACCESSファイルがあるファイルパスを取得することができます。ここから、ファイル名を削除して新たに保存するPDFファイルのファイル名を最後に付与しているのです。

InStrREv関数は文字列の中から指定した文字列を最後から検索し、最初に見つかった文字位置を返します。

ここで探している文字は「\」です。
CurrentDb.Nameでファイルパスを取得した際に、一番最後の「\」はファイル名の前にあります。
そのため、Left関数で「\」の前までにCurrentDb.Nameのテキストを短縮することで、ファイル名を除いたファイルパスに変換しているのです。

この設定を行うことで、自動的にACCESSのファイルと同じ場所に、指定のレコードの請求書をPDFで保存することが可能です。

以上、VBAでレポートをPDFに出力する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。