<img class="alignnone wp-image-2627" src="https://www.chishikinosoukonoseiri.com/wp-content/uploads/2018/01/printer-2178753_640-300x218.jpg" alt="" width="541" height="393" />

前回は以下の過去記事から、ボタンひとつで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つ。「OR」は大文字じゃないと反応してくれません。小文字の「or」ではダメということです。

<!--nextpage-->
<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のコードに落とし込んだものが以下になります。
<pre>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</pre>
&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;

今回の記事の途中でも書きましたが、右クリックメニューから印刷できる数は一度に「15個まで」です。16個以上を一度に印刷しようとしても右クリックメニューに「印刷」はwindowsの仕様で表示されなくなってしまいます。

&nbsp;

もう一つは、「検索ボックスに入れられる文字数には制限がある」ということです。Microsoftの以下のページには検索ボックスには最大259文字しか入らないとあり、必然的に検索できるファイルの数も制限されてきます。

<a href="https://answers.microsoft.com/ja-jp/windows/forum/windows_10-files-winpc/windows-10/40790c49-60f4-4e38-beac-689e499c9b1c?auth=1">Windows 10　エクスプローラー検索ボックスに259文字しか入らない </a>

&nbsp;

しかし数値の場合だと、この倍ぐらいは検索できたので今回のマクロを使う場合はそういった点も考慮されるといいかと思います。

&nbsp;
<h2>あわせて読みたい</h2>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display: block; text-align: center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5555284323037918" data-ad-slot="8783148987"></ins><script>(adsbygoogle = window.adsbygoogle || []).push({});</script>こんな記事も読まれています<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display: block;" data-ad-format="autorelaxed" data-ad-client="ca-pub-5555284323037918" data-matched-content-ui-type="image_card_stacked" data-matched-content-rows-num="3" data-matched-content-columns-num="3" data-ad-slot="8054263157"></ins><script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
<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>