【VBA】一気にPDFに出力できたらラクなのに・・・を解決

以前のぐちゃぐちゃなエクセルファイルを整えた話のおまけ。

 

当該業務には、最終的にデータが出来上がったら、その一部は対象となる社員へ通知書を出す、というフローがある。ここでは、より単純にするため、以下、採用内定通知書を例にし、うちの会社に存在したバカバカしい作業とその解決策について説明したい。

エクセルで作ったレター(帳票)を一枚一枚印刷やPDF出力するのって面倒くさい

発行する通知書が数枚なら諦められるのだけれど、1事務所につき数十枚あり、しかも今の会社のプリンタはカードなどでの制御の設定なし。つまり、いちいち印刷し、取りに行って、とウロウロするのが非常に面倒くさい。だからといって、レターの内容が内容なので、同僚にも頼めない。

作業例:採用内定通知の印刷

一体どういう作業のことを言っているのか。

実際には、こんな書類をエクセルでは作っていないのだけど、あくまで作業内容の説明として、以下見てほしい。

2018-06-27_Notifications

 

データシートと印刷用シートがあり、データシートのレコード数分、レターを発行する。インデックス番号を入力すると、レターの内容が変更される。つまり、一枚一枚印刷しなくてはいけない、ということ。

インデックス番号の入力、印刷、インデックス番号の更新、印刷の繰り返し、もしくは、インデックス番号の入力、PDF出力、ファイル保存、インデックス番号の更新、PDF出力、ファイル保存の繰り返し。

気が狂いそうになる。

他の拠点ではマクロで対応

相手にとってはこの上なく迷惑な話だが、せめて愚痴を聞いてもらってスッキリしよう、とエクセルファイルの整理をしていたときに、「この通知書の印刷って非生産的すぎません?印刷しない事務所分についてはPDFで送らなくちゃいけないし・・・」と、手伝ってくれていた地域本社の社員に言ってみた。

すると「僕も同じ作業をするけど、やっぱり面倒くさいって感じるからマクロを組んでるよ。」との答え。内心「やったー」と飛び跳ねたいのを必死に抑えながら、「じゃあ、このファイルにもそのマクロ機能付けてくださいませんか?」とお願いしてみた。

確かに少しは楽になるけども

そうして、送られてきたファイルには、インデックス番号入力の下に次の番号が表示される場所が付け足されていた(最後には意味がなくなるのだけど)。

どういう仕組みなんだろう、とワクワクしながら、インストラクションのメールを読んで、ちょっとだけがっかり。

「印刷開始の番号を入力後、【Ctrl + a】を押下。レターが印刷されます」だって1

結局、いちいち印刷しなくちゃいけない現実。

マクロでの解決法

私の期待は下回ったけれど、考え方は勉強になった。次のインデックス番号のセルを置くことで、マクロでも対応できるんだという発見。

Sub Macro1()

'Macro1 Macro
'Keyboard Shortcut: Ctrl a

'下に表示された数値をコピー。
Range("B4").Select
Selection.Copy

'上のセルに貼付(値の貼り付け)
Range("B3").Select
Selection.PasteSpecial  _
    Paste:=xlPasteValues, _
    Operation:=xlNone, _
    SkipBlanks:=False, _
    Transpose:=False
Application.CutCopyMode = False

'印刷
ActiveWindow.SlectedSheets.PrintOut Copies:=1

End Sub

【VBA】帳票を一気にPDF化して、後から必要なファイルだけ印刷するがベストでは?

せっかく作ってもらったのに、改善要求なんてできるわけもなく、仕方がないので(!)、VBエディタを開けて、自分でちまちま書いてみることにした。

ゴールは、レターごとの印刷やPDF化の作業の効率化。

PDFの一括印刷の機能2を使えば、複数ファイルの印刷は簡単なので、「レターをPDF化して、ファイル名を付けて保存」をすれば解決できそうである。

私の解答

そうして出来上がったのが下のコード。去年・今年と使ったが、数十個のファイルがあっという間に出来上がるのは、手前味噌ながら便利。

今回の例では、そこまで必要ではなかったのだけど、一気にすべてのレコード分を実行するのではなく、オフィス単位の方がいい場合もあるので、オフィス単位でPDF化するようにしている。

  • 別途、VLOOKUPの相対検索を使って、各オフィスの一番最初のインデックス番号の表を作り、Index欄の横に置く。
  • 作ったマクロは、ボタンに登録。
  • 表を参照しながら、インデックス番号を入力後、ボタンを押下。(了)

注意点

マクロの記録で対応するにしろ、VBAで対応するにしろ、レターの印刷設定を最初に行っておくのがいい。もちろん、印刷設定のコードを書くことも可能だが、レコードによって変化するものでもないので、コード外で設定した方がラク。

参考データ

コードで、セルの参照などをしているので、以下ワークシートのスクリーンショット。

【Databaseシート】

2018-06-27_Database

 

テーブル化し、【dFootballers】というテーブル名を付けている。

【Letterシート】

2018-06-27_Letter

 

ワールドカップ中なので、日本代表のリストで作成。

参照:


  1. キーボードショートカットは【Ctrl + Shift + a】とかの方がいいじゃないか、とかは言わない。ここでは、些末なことだから。 ↩︎
  2. 保存したPDFを複数選択→右クリック→【印刷】を選択。ただし一回に選択できるのは10ファイルまで。 ↩︎
Advertisements

This site uses Akismet to reduce spam. Learn how your comment data is processed.