ACCESS 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の操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。