ワークブック全体を1つのファイルとして保存する
VBA×PDFのシリーズ3つめの記事です。早速ですが先日いただいた質問を紹介します。
VBAを使って「ワークブック全体を1つのPDFファイルとして出力できないか」という内容でした。
結論から申し上げますと可能です。例によって「簡単にできる」様にしていきます。
Excel内の各シートでフォーマットが出来ているのでPDFにしたい範囲も決まっている様です。
あとはワークブック全部を1つのPDFとして出力、保存したいという事でした。
前回記事の「ワークシートの一部を範囲指定してPDFを発行する」とは真逆の作業ですね。
裏を返せばエクセルは色々な事ができるという事です。皆様色々な作業で苦労している様です。
VBAの強みは「Excelに関する仕事はどんなことでも瞬時に片付ける」という事です。
今回の依頼もしっかり対応しますよ。早速事例を見ていただきコードを紹介、解説していきます。
関連記事
VBAでPDFファイルを作成するにあたっての基本をまとめてあります。
ワークシートからPDFを発行する際に使うExportAsFixedFormatメソッドの説明をしています。
このメソッドはパラメータがたくさんあります。主要なパラメータについて解説をしています。
ワークブックを丸ごと1つのPDFとして出力する
前提条件がありましたので事前に紹介しておきます。
- 各ワークシートはフォーマット化されているのでPDFとして出力したい範囲が既に決まっている
- ワークシートにボタンを用意して1クリックでPDFファイルを作成したい
- ファイル名を作業日にしたい(2023年08月20日の場合は20230820.pdf)
- 作業ファイルと同じ階層にPDFを用意したい
ワークシートの枚数が作業日毎に違う様ですが気にしなくて良いので前提条件から外しました。
枚数が増減してもブック全体として出力するので作業は1回で済みます。
各ワークシートではPDFへの出力範囲がしっかり決まっています。シートの増減は問題無しです。
これらの条件をふまえてコードを用意しました。
コードと解説
先にコードを見ていただきます。そのあと解説していきます。
コード
コードはこちらです。ボタンからコピーできます。
ワークシート上に用意するボタンに埋め込んで使ってください。
Sub ワークブック全体をPDF()
Dim wb As Workbook '対象のワークブックを格納するオブジェクト変数
Dim day As String '日付を格納する為の変数
Set wb = ThisWorkbook 'コードが用意されているワークブックを格納
'メッセージボックスで作業開始を確認
If MsgBox("PDFを発行します。準備は良いですか?", vbOKCancel + vbExclamation, "確認") = vbOK Then
day = Date '日付を取得
day = Replace(day, "/", "-") 'スラッシュをバーに変更
day = day & ".pdf" 'ファイル名を確定させる
Else
MsgBox "ファイル名を指定しましょう", vbInformation, "お知らせ"
Exit Sub
End If
wb.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & day, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
シリーズ3回目の記事になりますので最初に紹介したコードからかなり変化してきました。
変化点としては4つです。
- PDF対象のオブジェクトをワークブックに変更
- メッセージボックスで処理を分岐
- 日付を取得しファイル名に変換
- ExportAsFixedFormatでパラメータの指定数を増加
1つずつ解説します。
解説
できるだけ簡潔に解説します。必要に応じて関連記事のリンクを用意しています。
PDF対象のオブジェクトをワークブックに変更
コードの序盤でwbという変数にワークブックを格納しています。
このオブジェクト変数を使って最後にExportAsFixedFormatメソッドを使ってPDFを出力しています。
ExportAsFixedFormatメソッドの上位オブジェクトはワークシートでもワークブックでも大丈夫です。
オブジェクトブラウザーの画像をご覧ください。
Chart、Range、Workbook、WorksheetオブジェクトがExportAsFixedFormatメソッドを持っています。
(Chartオブジェクトはグラフ関連のオブジェクトです)
メッセージボックスで処理を分岐
PDFを出力する際はワークシート内でボタンを押す事にしています。
ボタンを用意すると非常に便利なのですが作業中に違えてボタンを押してしまう事もあります。
そんな時の為にメッセージボックスで処理を管理する事にしました。
ワークシート内の「PDF」ボタンを押すとメッセージボックスが表示されます。
OKボタンを押したときだけPDFファイルを発行する様にしました。
(画像の黄色部がPDF対象範囲、赤色のボタンが「PDF」ボタンです)
ワークシート上にボタンを用意してもPDF対象範囲から外しておけばボタンがPDFに入る事は無いです。
メッセージボックスとIfステートメントを組み合わせる作業についての基礎はこちらの記事をご覧ください。
かんたん解説VBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる
日付を取得しファイル名に変換
IfステートメントのTrueの中にある3行の処理です。まずはDate関数を使って日付を取得します。
この際2023年08月20日の時は2023/08/20という文字列を取得する事になります。
この文字列内のスラッシュをReplace関数で2023-08-20という表記に変えます。
最後に拡張子を付け足してファイル名を作り上げます。
Replace関数について詳しく知りたい方はこちらの記事をご覧ください。置換について勉強する事ができます。
文字列を置き換えるマクロで文字列の置換はVBA関数のReplace|4つの方法を比較
ExportAsFixedFormatでパラメータの指定数を増加
各パラメータが何を指しているのかはシリーズ初回の記事をご覧ください。
記事リンクVBA×PDF|Excelデータを出力|メソッドをパラメータ毎に解説
パラメータは多いのですが半分ぐらいは簡単に使う事ができます。
使い方にクセがあるパラメータを絞って解説しているので興味がある方はリンクを確認ください。
特典
紹介したコードはPDFを発行する際の出力先は毎回同じ場所です。
1度PDFを出力した後に再度ボタンを押すと旧データを上書きしてPDFを発行する事になります。
しかし上書きしたくない時もあります。履歴を取りたい時ですね。
そんな時は以下コードを使ってください。(先程のコードをカスタマイズしました。)
ボタンでコードをコピーできます。VBEに貼っていただくと分かりますがプロシージャは2つです。
ファイルの重複確認+改訂番号を振る作業をサブルーチン化しています。
Sub ワークブック全体をPDF_応用編()
'ワークブック全体を1つのPDFとして出力する際上書きしない様にする
Dim wb As Workbook '対象のワークブックを格納するオブジェクト変数
Dim day As String '日付を格納する為の変数
Dim exte As String '拡張子を格納する為の変数
Dim idx As Variant '改訂番号を格納する為の変数
Dim hyf As Variant '文字列「-」を格納する為の変数
exte = ".pdf"
Set wb = ThisWorkbook 'コードが用意されているワークブックを格納
'メッセージボックスで作業開始を確認
If MsgBox("PDFを発行します。準備は良いですか?", vbOKCancel + vbExclamation, "確認") = vbOK Then
Call ファイルの重複確認(day, hyf, exte, idx) '別プロシージャでファイルの重複確認と採番を行う
Else
MsgBox "ファイル名を指定しましょう", vbInformation, "お知らせ"
Exit Sub
End If
wb.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.path & "\" & day & hyf & idx & exte, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
Sub ファイルの重複確認(dy As String, hf As Variant, ex As String, ix As Variant)
'各種変数は省略されていますが参照渡し(Byref)です
Dim file As String 'ファイルの完全パスを格納する為の変数
Dim pth As String
dy = Date '日付を取得
dy = Replace(dy, "/", "-") 'スラッシュをバーに変更
pth = ThisWorkbook.path & "\" & dy
Do
file = Dir(pth & hf & ix & ex) 'Dir関数でファイルの完全パスを生成して変数fileに格納
If file <> "" Then '変数fileに値がはいってないですよね?と聞いています
If ix = "" Then '変数ixが空欄か?
hf = "-"
ix = 1 '変数ixが空欄の時は変数ixに1を代入
Else
ix = ix + 1 '変数ixが1以外の時は変数ixに1を足す(ここで重複を防ぐための改訂番号を作る)
End If
End If
Loop Until file = ""
End Sub
連結演算子やDir関数、Ifステートメントのネスト、Do~Loopステートメント等盛り沢山の内容です。
ちょっと難しいかもしれないのでコード内にコメントを多めに書いています。
Dir関数についてはこちらの記事を用意しました。動画も準備されており分かり易く解説しています。
Dir関数について解説VBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する
まとめ
今回のコードを使えばワークブック全体を1つのデータとしてPDFを出力することができます。
ある程度コードを用意しましたが記事を読んでいただいている皆様の仕事が網羅される事はありません。
ここからは皆様がご自身の仕事に合うようにカスタマイズして使ってください。
PDFについてはもう少し質問をいただいておりますのであと何回か記事を用意する事にしています。
参考:今回の記事はシリーズ化されています。前回記事を紹介します。