業務改善

PDF大量作成をVBAで実現する方法~帳票作成時間を短縮できるかも~

請求書や領収書などの帳票をPDFで作成する機会が増えてきました。
PDFの作成はExcelで可能ですが、大量となると・・やや大変です。

今回はエクセルVBAを使ってPDFを大量に作成する方法を紹介します。

なぜエクセルVBAでPDF作成?

まずは「なぜエクセルVBAでPDF作成をするのか?」という疑問の解消をしていきたいと思います。

理由は以下の2点です。

  • 帳票作成をする部署は事務系に多い
  • 帳票作成に使用するデータはエクセルと相性がいい

エクセルは事務系の部署でよく使う印象なので、普段から使い慣れているソフトを自動化すると処理内容も分かって安心です。

また、帳票を作成するために使用するリスト(会社名・金額など)を管理、参照する場合もエクセルで作りやすいので何かと便利です。

PDF作成の準備

さっそく、PDF作成の準備を行います。
以下のような順番に行っていけばPDFの大量作成ができるようになります。

  • テンプレートの作成
  • リストデータを別シートに貼り付け(場合によっては加工)
  • XLOOKUP(VLOOKUP)などで帳票の必要箇所を編集
  • VBAプログラムを作成

手順が多いので少したいへんですが、少しずつ進めていきましょう。

テンプレートの作成

最初はテンプレートの作成です。

帳票を印刷する場合と同様に、データを差し込み印刷するようなテンプレートを作ることが重要です。

とはいっても、会社で帳票を発行している場合にはすでにテンプレートが存在するはず。

もし、帳票がある場合は、テンプレートをコピーしてみてください。(別ファイルにコピーすればPDF作成テストもできると思います)

この記事では、イメージしやすいように以下のようなテンプレートを作成しました。

領収書テンプレート

リストデータを別シートに貼り付け

帳票のテンプレートの準備ができたら、次は帳票を発行するために使用するデータです。

発行する帳票によって異なりますが、今回は「会社名」「領収書番号」「請求書番号」「領収金額」項目を作成しました。

ポイント

自分のパソコンでテストする場合には、会社名などのデータはなかなか手に入りにくいと思います。

この記事では、個人情報テストデータジェネレーターというサイトで作成したデータを使用しました。

帳票作成に必要なデータの準備ができたら、テンプレートとは違うシート(シート2など)に貼り付けます。

この記事では、以下のようなデータを作成しました(もちろんダミーデータです)

今回は、全285件のデータを作成しました(小規模な会社の取引先数を想定しましたが、量が多くても問題ないと思います)

ポイント

ダミーデータで作成できないものといえば「金額」だと思います。
1円、2円・・と順番に作成してもいいのですが、できることなら実際にありそうなデータにしたいところ。

このようなデータもエクセル関数を使えばかんたんに作成できます。
例えばこの関数。

=RAND()*1000000

0以上1未満の乱数を表示する関数です。ですが、金額としては少ないので、100万を掛けています。すると、0から100万円の間のランダムな値ができ上がります。

ダミーデータ作成で役立つと思います。

XLOOKUP(VLOOKUP)などで帳票の必要箇所を編集

帳票のテンプレート、データリストができ上ったので、帳票に表示する作業を行っていきます。
やることは、XLOOKUP(VLOOKUP)を使って、帳票に表示させるデータをリストから取り出していきます。

(エクセルVBAで指定したセルに入力することもできますが、今回はシート上でできることはやってしまいたいと思います)

今回はC2セルの「会社名」をキーにしてG1セル、G3セル、D4セルの値を入力するようにしています。

VBAプログラムを作成

テンプレート、挿入するデータリスト、VLOOKUP(XLOOKUP)関数の追加まで行ってきました。

最後は、PDFを作成するためのVBAプログラムを書いていきます。

PDFを作成するだけということで以下のようなコードを書いてみました。

Sub PDF大量作成()
'変数を作成
Dim savePath As String, fileName As String, lastRow As Long, i As Long

'savePath:エクセルファイルと同じパス
savePath = ThisWorkbook.Path

'領収書リストの最終行を取得
lastRow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastRow
    'ファイル名:領収書番号_会社名 と指定
    fileName = Sheet2.Cells(i, 2).Value & "_" & Sheet2.Cells(i, 1).Value
    
    'C2セルに会社名を入力(会社名を入力後、他のセルはVLOOKUPで自動入力される)
    Sheet1.Range("C2") = Sheet2.Cells(i, 1).Value
    'PDFファイルを作成する。
    Sheet1.ExportAsFixedFormat Type:=xlTypePDF, fileName:=savePath & "\" & fileName
Next i

End Sub

プログラム作成後、実行ボタンを押すだけでPDFの大量作成ができてしまいます。

※ちなみに、285件のPDF作成を実行してみた結果3分ほどで処理が完了しました。
(手作業だったら何時間もかかっていたかもしれません)

初めてのPDF大量作成はちょっとうれしい瞬間

【応用】作成したっけ?を防止する

先ほどのPDF大量作成プログラムはとても便利なのですが、一点問題が・・・それが「このPDF作成済みだったっけ?」と心配になること。

それを解消する方法は「作成時間を記録する」ことです。

PDF作成後の処理に「作成時間を転記」「ステータスを入力」の2つの処理を追加しました。

Sub PDF大量作成()
'変数を作成
Dim savePath As String, fileName As String, lastRow As Long, i As Long

'savePath:エクセルファイルと同じパス
savePath = ThisWorkbook.Path

'領収書リストの最終行を取得
lastRow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastRow
    'ファイル名:領収書番号_会社名 と指定
    fileName = Sheet2.Cells(i, 2).Value & "_" & Sheet2.Cells(i, 1).Value
    
    'C2セルに会社名を入力(会社名を入力後、他のセルはVLOOKUPで自動入力される)
    Sheet1.Range("C2") = Sheet2.Cells(i, 1).Value
    'PDFファイルを作成する。
    Sheet1.ExportAsFixedFormat Type:=xlTypePDF, fileName:=savePath & "\" & fileName
    
    '作成時間を転記
    Sheet2.Cells(i, 5) = Format(Now, "YY年MM月DD日HH時MM分SS秒")
    
    'ステータスを入力
    Sheet2.Cells(i, 6) = "作成済み"
Next i

End Sub

プログラムを実行すると、以下のようになります。

PDFの作成時間、作成済みステータスがあると安心

作成時間の表記についてはこちらの記事で紹介しています。

タイトル画像
参考【現在時刻取得】Format(Now,"YYMMDDHHMM")の活用法を紹介【Excel VBA】

エクセルVBAを使っていると「現在時刻の取得」が必要なことがあります。 そんな時に便利なのがFormat関数です。その反面、使い道が分かりにくいこともあるので、今回はFormat関数(Nowを使った現 ...

続きを見る

あとがき

今回は、PDFを大量作成する方法を紹介しました。

帳票の電子化でPDFファイルを作成する機会が増えていると思います。
特に領収書、請求書などは毎月大量に発行する必要があるので、早めに自動化をしておくことで業務効率化ができます。

書類(紙データ)の電子化と電子データの作業時間を少なくしていけばスマートな働き方も夢ではありません。

気になった方は試してみてください。

-業務改善
-, ,