みなさん、こんにちはケンケンです。
せっかく作った書類、効率よく保存して管理したいですよね。
今回は、VBAを使ってエクセルシートをPDF化して、名前を付けて保存する方法をご紹介します。
この方法をマスターすると書類管理を効率化できるだけでなく、
- 作った資料の紛失を防ぐ
- データを修正した場合に変更前の資料を確認できる
などの利点もありますので、参考にして下さい。
エクセルに限らず、資料を作成したらそのまま保存し、次に作るときには上書きすることって多くないですか。
上書き自体は問題ありませんが、上書きする前のデータを別管理で保存しておくことが、業務効率化を図るうえで重要になってきます。
また、コンプライアンス的にも大切な概念です。
そこで、シンプルな方法としてPDFで管理することをお勧めします。
そして、そのPDF管理をVBAで制御できたら便利ですね。
今回は、VBAを使ってPDF管理を自動化する方法をご紹介します。
シートのコピーを自動化する(復習)
- ある報告書を氏名リストシートに載っている人数分コピーして
- コピーしたシートをPDFに変換して
- エクセルファイルが保存されているフォルダへ格納する
という手順で解説していきます。
シートのコピーを自動化する方法は以前にご紹介していますので、復習したい方はこちらをどうぞ
シートをコピーしよう
それでは、まずシートをコピーして氏名リストの人数分の報告書を作成しましょう。
今回は、以下のような構成で進めていきます。
まず、フォルダ「PDF」を作成し、そのなかにエクセルファイル「PDF変換」を用意します。
PDF変換ファイルには以下の2枚のシートを用意します。
それぞれのシートの内容は以下のようにしました。
準備が出来たらコードを書いていきましょう。
その前に、VBEの起動とモジュールの追加をするショートカットをご紹介します。
まず、「Alt」+「F11」するとVBEが起動し、「Alt」を押したまま「I(アイ)」→「M」の順で押すとモジュールが生成されます。
便利なショートカットなので覚えておきましょう。
そこまでできたら、追加されたモジュールに上記のコードを書いて実行します。
Sub create_PDF() Worksheets("報告書(元)").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = Worksheets("氏名リスト").Range("A2").Value ActiveSheet.Range("I2").Value = Worksheets("氏名リスト").Range("A2").Value End Sub
すると、以下のようになりますね。
■自動化しよう
自動化するための第一歩は、一回目の処理ができるか否かが重要です。
上記でお伝えした、シートをコピーして名前を変更するまでが第一歩であり、重要な部分です。
そこをクリアすれば、あとはForNextを使って自動化するだけです。
自動化できずに伸び悩んでいる人の多くに、いきなり自動化しようとしてしまう特徴があるので、
まずは一つ目の処理をクリアすることを心がけてください。
そこまで出来れば、あとは構文に当てはめるだけです。
それでは、自動化してみましょう。
Sub create_PDF() Dim Pcnt 'person count Dim Lrow '最終行取得用 Lrow = Worksheets("氏名リスト").Range("A" & Rows.Count).End(xlUp).Row For Pcnt = 2 To Lrow Worksheets("報告書(元)").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = Worksheets("氏名リスト").Range("A" & Pcnt).Value ActiveSheet.Range("I2").Value = Worksheets("氏名リスト").Range("A" & Pcnt).Value Next End Sub
先ほど書いたコードを上記のように変更変更しました。
ForNextを使ったコードの書き方の見本はこちら、また、最終行を取得する方法はこちらを参考にしてください。
それではコードを実行しましょう。
氏名リストに載っている人数分のシートが作成されましたね。
ここまでは、復習の段階です。
ここからPDF変換の方法をお伝えしていきます。
PDFに変換してみよう~資料管理の基本~
PDF管理することによって
- 資料整理の促進
- ミスや確認漏れの減少
につなげることが可能です。
是非、VBAでPDF化するコツをつかんで実務に活かしてください。
■PDF化してみよう
では、さっそくPDFに変換するコードを書いていきます。
定型文があるのでそのままコピーして使ってください。
Sub create_PDF2() ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ThisWorkbook.Path & "\" & Format(Date, "yyyymmdd") & "_" & ActiveSheet.Name & ".pdf" End Sub
※ThisWorkbook.Path &の後のダブルクォーテーションの中は「¥」です。VBEにコピペした時は、¥マークになります。
ちなみに、今回想定している業務フローは
- 報告書を人数分コピー
- 各人が報告書を記載する
- 完了後全員分をPDFに変換する
としています。
報告書を人数分コピーする作業とPDF化する作業は、別工程になっていますね。
ですので、先ほど書いたコードとプロシージャを分けます。
では、コードの解説をしていきます。
「ExportAsFixedFormat」とありますが、これはPDFなどのファイル形式に変換するメソッドです。呪文のようなものです。
もし、忘れたら自動記録を使って調べてください。
自動記録の使い方は以下の記事を参考にしてください。
みなさん、こんにちはケンケンです。 前回は、ForNext構文を使った例をお見せしました。 請求書作成自動化への道が一歩一歩切り開かれていますよ。もう少しで完結しますからがんば[…]
「Type:=xlTypePDF」これは、変換後の形式を選択しています。そのままですね、分かり易いと思います。
そして、ここからがとっつきにくい箇所になっていきます。
■ThisWorkbook.Pathって何だろう
変換形式を選択したら、「Filename:=」以下で格納先と名前を指定します。
格納先のアドレスと名前を「¥」でつなげていきます。これをフルパスといいます。
具体的に見ていきましょう。
まず、ThisWorkbook.Pathというコードがあります。これは、今現在あなたが使っているファイルのパスを示しています。
メッセージボックスで表示させてみましょう。
みなさんの表示結果はどうなりましたか?
塗りつぶされている個所はあなたの使っているPCのユーザ名が入ります。
このコードを読むと、僕の場合は、
「Cドライブの中のUsersの中の(PCユーザ名)の中のデスクトップの中のPDFフォルダの中」となります。
では、メッセージボックスに表示されたパスを直接VBEに記述すると、どうなるでしょうか。
エラーになります。
当然ですね。PCのユーザ名が入っているし、どこでこのコードを実行するか分からないので、僕のPCでしか使えないですね。
そこで、どこで実行しても動作するように用意されているコードがThisWorkbook.Pathです。
このコードを実行すると、どのPCのどの階層にいても任意でパスが指定されることとなるのでエラーになりません。
次に「¥」マークの説明ですが、これは、ひとつ下の階層を示しています。
つまり、ThisWorkbook.Pathの次にある「¥」は僕の事例で言うと「PDFフォルダの中に」という意味です。
「”¥” & Format(Date, “yyyymmdd”) & “_” & ActiveSheet.Name & “.pdf”」
上記は¥マーク以降の名前でPDFフォルダの中に保存してね、という意味です。
続いて、ファイルの名前を指定します。
今回は、作成日が名前の最初にくるようにします。
作成日を表示するには、Format関数を使います。Format関数は、第一引数に、日付などで文字列型に変換したい値を指定します。
作成日を表示したいので「Date」をあてはめます。
そして、第二引数では書式を設定します。今回は、”yyyymmdd”としています。
作成日が2020年10月30日だったら20201030と8ケタで表示されます。
続いて以下の部分を解説します。
“_” & ActiveSheet.Name & “.pdf”
まず、”_”で日付のあとに区切りをつけていきます。
そして、ActiveSheet.Name & “.pdfで今現在選択しているシート名がPDF名となります。
さて、準備は整ったのでコードを実行して、PDFフォルダ内に日付とシート名が明記されている状態で保存できるか確認してください。
自動化してみよう
では続いて、報告書すべてをPDF化してみましょう。
まずは、コードをお見せします。
Sub create_PDF2() Dim Scnt 'シートの枚数を数える Scnt = Sheets.Count Dim PDFcnt For PDFcnt = 3 To Scnt Worksheets(PDFcnt).ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ThisWorkbook.Path & "\" & Format(Date, "yyyymmdd") & "_" & Worksheets(PDFcnt).Name & ".pdf" Next End Sub
要点は、ActiveSheetの部分を変数で回していけばよいですね。
ForNextを使います。
まず、シートの枚数をすべて数えるためにSheets.countを記述します。それを変数Scntに格納します。
そしてForNextで使う変数PDFcntを用意し、3枚目からScntに格納されている数字まで繰り返すよう記述します。
なぜ3枚目かというと、2枚目までは、氏名リストと報告書の元データなのでPDF化する必要がないからです。
そして、ForとNextの間で繰り返すべき部分である、ActiveSheetの部分をWorkSheets(PDFcnt)と書き換えれば完成です。
それでは、実行してみましょう。
どうですか。
報告書を作成した全員分のシートをPDFに変換できましたか。
以下のように作成されていれば成功です。
そこまでできたら、最後に、ボタンを作っておきましょう。
今回は、報告書シートを氏名リストにある人数分コピーするボタンと
PDFに変換する用のボタンの2つを作成していきます。
ボタンの作り方は以前の記事を参考にしてください。
こんな感じになります。
シート削除機能もつけておくと便利ですね。
それについても別記事で紹介しているのでこちらを参考にしてご自分で挑戦してください。
シート削除用のボタンも作っておくとなお良いですね。
まとめ
いかがでしたか。
今回は、PDF変換についてご紹介しました。
PDFで管理することによって、仕事の効率化だけでなく、運用面でも大きなメリットがあります。
また、改めて自動化(ForNext)の事例をあげましたが、それほど難しくなかったと思います。
基本を意識して、一つ目の処理をきっちりこなしていければ自動化は簡単です。
是非、今回ご紹介した方法を使って、今後の業務改善にお役立て下さい。
それでは、次回もお楽しみに。
この記事を読んだ方には以下の記事がおススメです。
エクセルVBA入門編~請求書作成自動化への道~記事一覧
【エクセルVBA入門編①】VBAで何ができるのだろうか?【請求書自動作成の第一歩】
【エクセルVBA入門編②】めんどうな仕事はForNext構文で解決【請求書自動化の最重要構文】
【エクセルVBA入門編③】繰り返し作業はFor Next構文で完全自動化!【請求書作成自動化は目前!】
【エクセルVBA入門編④】自動記録を使い方とコード編集法を解説【請求書作成自動化への道】