前回は以下の過去記事から、ボタンひとつでPDFを印刷できるマクロとVBAができ

ないか試行錯誤したことについて書きました。
<ul>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2018/01/20/0951">SendKeysメソッドとFolderfilelistでPDFを自動印刷できないか</a></strong></li>
</ul>
&nbsp;

残念ながら自分の勉強不足のせいで上手く動作しなかったのですが、その理由は、

PDFが開く読み込み時間を待てずにエクセルからPDFへSendkeysメソッドで指示を

送ってしまうからではないか、と考えました。

&nbsp;

現実の業務では今でも結構多めのPDF印刷の指示があったりするので、何とかして

この作業を自動化できないかと考えていろいろと試行錯誤をした結果、別の方法で

印刷できる方法を見つけました。今回はその方法について書いていってみます。
<h2>指定のPDFを一括印刷するための3つのアイデア</h2>
自分の理想としては、仕事で日々使っている表の中にあるPDFファイル名から印刷

したいいくつかをコピーして、別シートの指定の場所に貼り付けて、それでマクロ

のボタンを押すとコピペしたファイル名のPDFを自動で印刷できるというものです。

&nbsp;

そのためにインターネットでPDFを一括で印刷できる良い方法はないかとあれこれ

調べていたら、いくつか良い方法を見つけました。それは以下の3つになります。
<ul>
 	<li>CONCAT関数</li>
 	<li>フォルダの検索ボックスはOR関数を使うと一度に複数検索できる</li>
 	<li>検索ボックスで表示した複数のPDFは右クリックメニューから一度に印刷できる</li>
</ul>
上から順番に説明していきます。
<h2>CONCAT関数</h2>
CONCAT関数とはエクセル2016のバージョンから導入された関数です。これがどう

いう関数かというと、指定の範囲内の文字列をつなげられる関数です。

&nbsp;

通常違うセルにある文字列をつなげる場合、文字列内に「&amp;」を使うか、もしくは

CONCATENATE関数を使うのではないでしょうか。

&nbsp;

例えばエクセルでA1セルに「A」、B1セルに「B」とあって、C1セルにA1セルとB1

セルの文字列をつなげて表示したかったとします。

&nbsp;

「&amp;」を使う場合、C1セルに「=A1&amp;B1」と入れることで文字列をつなげて表示さ

せることができます。

&nbsp;

CONCATENATE関数を使う場合は、引数にひとつひとつ「A1」「B1」と入れてや

らなければいけません。

&nbsp;

今のは1つの例で2つのセル間の文字列しか出しませんでしたが、これが10とか20、

さらに50とか100個のセル間の文字列をつなげる場合、膨大な手間がかかります。

&nbsp;

こういった問題を解決してくれるのがCONCAT関数です。例えばA1セルからA100

セルまで何らかの文字列が入っていて、それを全部つなげたいとします。

&nbsp;

CONCATENATE関数などを使う場合であればA1セルからA100セルまで100個のセ

ルをいちいち引数に設定しなければいけません。要は100回の手間が必要というこ

とです。

&nbsp;

CONCAT関数ならA1セルからA100セルまでを「範囲選択」するだけで文字列をつ

なげられます。A1セルを選択してA100セルまでドラッグすればいいだけなので、

2回の手間で済みます。

&nbsp;

ちなみにエクセル2016にはCONCAT関数はあるのですが、それより前のバージョン

にはありません。前のバージョンでも使いたい場合はではどうすればいいのかとい

うと、「ユーザー定義関数」というものを使います。

&nbsp;

要は今までなかった機能をコードを通してつくってしまうということです。自分は

以下のページを参考にさせていただきました。

<a href="https://www.excelspeedup.com/concat2/">concat関数の使い方とExcel2013以前の古いエクセルで使う方法</a>

&nbsp;

参考ページにあるコードを使いたいエクセルファイルのVBEで表示される標準モジ

ュールにコピペすることで使えるようになります。
<h2>OR関数でフォルダの検索ボックスを利用すると一度に複数のファイルを検索できる</h2>
このやり方を知ったときは、本当に目から鱗が落ちる思いでした。今までの自分で

あれば、印刷したいPDFがあった場合、次のような手順をとっていました。

&nbsp;

PDFが入っているフォルダを開いて右上の検索ボックスに１つ１つ検索したいPDF

のファイル名をコピペしていきます。それで表示されたPDFをダブルクリックして

開いて印刷するという感じでした。

&nbsp;

しかし「OR関数」を使うと一度に複数のファイルを検索できます。例えば「A」

というファイルと「B」というファイルを検索したい場合、検索ボックスに

「A OR B」と入れるとAとBのファイルを一度に検索して表示させることができ

ます。

&nbsp;

ここでのポイントは以下の1つ

&nbsp;

1つ目は「OR」は大文字じゃないと反応してくれません。小文字の「or」では

ダメということです。
<h2>右クリックメニューから一度に印刷できる</h2>
この機能も目から鱗が落ちる思いでした。通常、PDFでもエクセルファイルでも印

刷する時というのは、一度ファイルを開くかと思います。

&nbsp;

その後PDFであれば、メニューバーのファイルを選択、表示されたドロップダウン

メニューから「印刷」を選択して「印刷ダイアログボックス」を表示させます。そ

れから「印刷」ボタンを押すことで印刷をすることができます。

&nbsp;

もしくはショートカットキーの「Ctrl+P」で印刷ダイアログボックスを表示させて

から印刷ボタンを押して印刷することができるかと思いますが、どちらにしてもい

くつか手順を踏まなければいけません。

&nbsp;

以上のように一回表示させなくても印刷できるようにしたのが右クリックメニュー

からの印刷です。

&nbsp;

例えば、フォルダの右上の検索ボックスで印刷したいファイル名を入力してファイ

ルを表示させたとします。その表示されたファイルを選択して右クリックで表示さ

れるメニューに「印刷」があるので、そこをクリックするだけで印刷できるという

ものです。

&nbsp;

この機能を使えば、印刷したいファイルを毎回開かなくてもよくなります。さらに

ポイントが1つあります。

&nbsp;

それは印刷できるファイルは1つだけではなく、最大15個まで選択して一括して印

刷できるというものです。

&nbsp;

人によっては16個以上のファイルを一度に印刷したい場合もあるでしょう。けれど

もそのような場合はwindowsのレジストリファイルを少しいじらなければならない

ようです。

&nbsp;

windowsのレジストリはOSの機能を満たすために重要なデータが入っているので、

この部分に詳しい人以外はあまりいじらない方がいいかと思われます。
<h2>今回の記事のVBAのコードとシート上でしておくべきこと</h2>
以上のアイデアをVBAのコードに落とし込んだものが以下になります。
<blockquote>Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

Sub 検索印刷()

Dim time As Long
time = 500

Sheets("検索印刷").Range("E2").Copy

CreateObject("Shell.Application").Open "C:\○○\○○\○○\○○"

’○の所には印刷したいファイルが入っているフォルダのパスを入れる

Sleep time

SendKeys "^{f}"

SendKeys "^{v}"

End Sub</blockquote>
&nbsp;

次にエクセルのシートを以下のような形にします。

<img class="alignnone wp-image-2623 size-full" src="https://www.chishikinosoukonoseiri.com/wp-content/uploads/2018/01/検索印刷.jpg" alt="" width="669" height="385" />

・シート名を「検索印刷」へ修正

・「ファイル名をコピペ」の下に印刷したいファイルの名前をコピペ。

・それ以外のセルに表示されている文字列は、ふきだしの中にある数式を入力。

&nbsp;

以上の処理からマクロを実行すると、次のような処理が実行されます。

・印刷したいファイルが入っているフォルダが表示

↓

フォルダの右上の検索ボックスに印刷したいファイル名をつなげたものが入力され

る

↓

フォルダ上に指定のファイルが表示される

&nbsp;

自分の理想としては、フォルダに表示されたファイルを全て自動で印刷できるよう

にしたかったのですが、この部分で止めておきました。理由はいくつかあります。

&nbsp;

1つ目は、「人によってファイルによって印刷したいページが違う」からです。

例えば印刷したいファイルが10個あったとします。人によっては全部「2ページ目

だけ印刷したい」ということもあるでしょう。

&nbsp;

フォルダに表示されたファイルを全て選択して右クリックメニューから印刷を実行

すると全てのファイルで全てのページが印刷されてしまいます。中には100ページ

くらいのPDFファイルもあるかもしれません。

&nbsp;

本当は一枚だけでいいのにマクロで全て印刷できるようにしてしまうと100ページ

あるファイルも全て印刷されてしまいます。ということで、印刷までの処理はマク

ロの中には入っていません。

&nbsp;

2つ目は、「ファイル自体をコピーしたい」という需要です。印刷ではなくて指定

のファイルを別のフォルダにコピーだけできれば良いという人もいるかもしれませ

ん。自分が実際に業務上でそのような指示があったのでこの部分を思いつきました。

&nbsp;

今回の記事で書いた方法を使えば、1つ1つ特定のファイルをフォルダの検索ボック

スにコピペして表示されたファイルをコピーして別フォルダにコピペしなくてもよ

くなります。

&nbsp;

なぜなら一回で探したいファイルを一度にフォルダ上に表示できるので、一回でコ

ピペできるからです。そういった需要も考えて、今回のマクロでは印刷までの処理

はあえて入れないようにしました。
<h2>使い方と効果</h2>
&nbsp;

&nbsp;
<h2>まとめ</h2>
&nbsp;

&nbsp;
<h2>あわせて読みたい</h2>
<ul>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/11/17/1248">業務を自動化できる技術を持たないと自動化される時代が来るかもしれない</a></strong></li>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/11/17/1248">なぜプログラミング言語の習得が叫ばれるようになってきたのか</a></strong></li>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/11/02/2333">VBAで日次業務のマクロをつくって試してみた結果</a></strong></li>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/10/07/1206-2">経理でマクロやVBAが使えるとミスが劇的に減って仕事が本当に楽になる</a></strong></li>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/04/23/143607">今後のスキル偏重型技術革新で、機械といかに協力できるかが問われてくる</a></strong></li>
</ul>