ExcelからPDF保存、苦労していませんか?
Excelで作成した内容をPDF化することは実務上よくあります。
例えば、今回は請求書の作成について、一例を挙げますが、請求書であれば、複数社に請求書を送付するので、すべてPDFにします。
出力する時には、
- 「〇〇株式会社_202404分」みたいにファイル名を毎回入力している
- 人によって命名ルールがバラバラ
- 保存ミスや上書きミスが起きる
このような問題が生じることがありますが、マクロで一気に解決できます。
請求書のPDF化を考える
今回行いたい内容
- Excel上に請求データが一覧で並んでいる
- 各取引先ごとに請求書をPDF出力する
- 「取引先名_日付」の形式でファイル名をつけて保存したい
- 指定フォルダに、ルールに従った名前でPDFを一括保存する
シート構成の例
Excelの”請求一覧”シートに次のような情報が並んでいると仮定します。
A列 | B列 | C列 |
---|---|---|
取引先名 | 請求金額 | 請求日 |
株式会社A | 120,000 | 2024/04/01 |
株式会社B | 80,000 | 2024/04/01 |
株式会社C | 96,000 | 2024/04/01 |
ステップ1:1社ずつPDF出力する準備
まずは「請求書」フォーマットが印刷される専用のシート(例:”請求書”シート)を用意しておきましょう。 このシートはマクロによって、行ごとのデータを入力してからPDF化されます。
ステップ2:VBAコード(PDF保存用)
次に、VBAコードを使ってPDFファイルとして保存する処理を書きます。
Sub invoice_PDF()
Dim wsList As Worksheet
Dim wsForm As Worksheet
Dim i As Long
Dim lastRow As Long
Dim clientName As String
Dim billingDate As String
Dim fileName As String
Dim savePath As String
Set wsList = Worksheets("請求一覧")
Set wsForm = Worksheets("請求書")
lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
clientName = wsList.Cells(i, 1).Value
billingDate = Format(wsList.Cells(i, 3).Value, "yyyymm")
' 請求書シートにデータを転記(例:顧客名と金額など)
wsForm.Range("B2").Value = clientName
wsForm.Range("B3").Value = wsList.Cells(i, 2).Value
wsForm.Range("B4").Value = wsList.Cells(i, 3).Value
' ファイル名と保存先を作成
fileName = clientName & "_" & billingDate & ".pdf"
savePath = ThisWorkbook.Path & "\" & fileName
' PDFとして保存
wsForm.ExportAsFixedFormat Type:=xlTypePDF, Filename:=savePath
Next i
MsgBox "PDF出力が完了しました!"
End Sub
コードの説明
今回2つのシートの行き来をするため、Set構文を使って、シートの指定をはじめにしておきます。
シートの指定については、今回のように「シートをSetで指定する方法」もしくは、「シートを選択する方法」が取れるので、データを移行する量なども考えて、どのように処理するか考えてみましょう。
請求一覧と、請求書のシートが作成されていると想定しているので、請求書のシートに、請求書一覧からデータを反映させます。
作成時に意識することとしては、PDF化を行うので、最終的にどのような名前をつけるのかを考え、名前になる分を変数に入れるなどしておくとスムーズです。
PDFで保存するためには、パスで設定する必要があることと、PDFのファイル名については、「.pdf」まで指定する必要があります。指定した上で、For構文が動くことにより、顧客名のファイルが順番にできていくというVBAコードになっています。
VBAコードの内容
Worksheets("請求一覧")
:データが一覧で並ぶ元シートWorksheets("請求書")
:印刷用の書式シート(各PDFの元)ExportAsFixedFormat
:PDFで保存する関数Format(..., "yyyymm")
:年月だけ抽出してファイル名に使用
応用編:保存先フォルダを選べるようにする
savePath = Application.GetSaveAsFilename(InitialFileName:=fileName, _
FileFilter:="PDFファイル (*.pdf), *.pdf")
このようにすれば、保存場所やファイル名を手動で調整できるようになります。
よくある質問(Q&A)
Q1. フォルダにすでにファイルがあったら?
同じ名前があれば上書きされるので、ファイル名に日付や時刻を含めると安心です。
Q2. 名前に使えない文字(/や\など)があるとどうなる?
ファイル名に使えない文字を事前に Replace
関数で除去しておきましょう。
clientName = Replace(clientName, "/", "_")
まとめ
今回は請求書で説明をしましたが、同じシートを別名保存する場合には、今回のような方法がとれます。様々な場面で今回のようなことはおこりえるので、アレンジしてみましょう。
改めて今回行った内容ですが、
- 毎回ファイル名をつける手間を省ける
- 命名ルールを統一できる
- 出力ミス・上書きミスを防げる
請求書だけでなく、見積書・納品書・出勤簿などにも応用可能です。
コメント