<img class="alignnone  wp-image-2596" src="https://www.chishikinosoukonoseiri.com/wp-content/uploads/2018/01/pdf-155498_640-300x300.png" alt="" width="534" height="534" />

&nbsp;

最近は企業の「生産性」というものに注意が払われるようになってきました。要はいか

に少ない労力でより多くの成果をあげるかということですが、これは個人のレベルでも

業務のやり方の「改善」という形で多くの人が創意工夫してきたと思われます。

&nbsp;

しかしブルーカラーと言われるような現場の方たちの生産性は日本は世界の中でトップ

クラスと言われていますが、本社で働いているような事務的な仕事をしているホワイト

カラーと言われる人たちの生産性は世界に国々と比較すると燦燦たる有様のようです。

&nbsp;

自分は経理としていくつかの会社でここまで何年か働いてきましたが、特にさぼってい

たわけではなく、むしろ「どうすればもっと速くミスなくできるようになるか」を常に

考えながら仕事をしてきました。

&nbsp;

そのような意識の中で仕事をしながら見つけたのがエクセルのVBAです。エクセルの

VBAについての効果やすごさについては最近このブログでよく書いていきました。

&nbsp;

最近はどうすれば「VBAを使って指定のPDFを一括して印刷できるか」を考えていまし

た。というのも、現在の仕事で時々上司から「○○の請求書のコピーを×月から△月ま

で印刷しておいて下さい」と言われるからです。

&nbsp;

別に1枚や2枚だったら特に気にすることもないのですが、これが10枚や20枚になって

くると面倒になってくるからです。

&nbsp;

今回はタイトルにもあるように、この請求書のPDFについて拙いながらも自分なりに

「SendKeysメソッドとfolderfilelistでPDFを自動印刷するVBAとマクロ」について考

えてみたので、そのことについて今回は書いていってみます。

&nbsp;
<h2>指定のPDFを印刷するまでの手順と背景</h2>
事務的な職業をしている方でもそうでない人でもPDFを印刷したことがある人は多い

でしょう。PDFを印刷する時というのは、基本的に次のような手順になるかと思いま

す。ちなみにここではパソコンのデスクトップ上にPDFファイルがあると仮定します。

&nbsp;

まず指定のPDFのファイルをダブルクリックして開く

↓

開いたPDFファイルのメニューから「ファイル」を選択

↓

ドロップダウンされた中から「印刷」を選択

↓

開かれた印刷ダイアログボックスから「印刷」を選択

&nbsp;

以上が大まかな流れかと思います。上に挙げた例はわかりやすいように非常に簡略化し

ました。実際の業務などでは印刷したいPDFはデスクトップ上にはなく、決まったフォ

ルダに格納されているのが普通かと思います。

&nbsp;

また印刷するときも、その時の状況によって印刷ダイアログボックスから「どのページ

にするのか」といったことや「カラーか白黒か」といった点など、いろいろと変えなけ

ればいけない設定が出てくる場合もあります。

&nbsp;

以上のような手順をエクセルのVBAで自動化できないものかと思いました。しかしPDF

というと、エクセルとは違うアプリケーションになります。正確にはAdobe Acrobat

Reader DCというアプリケーションになるわけですが。

&nbsp;

もしかしたら何らかの方法があるかもしれないとインターネット上でいろいろと検索し

てみました。あるにはあるのですが、どれも自分が勉強してきたレベルでは理解できな

いような難しいコードです。

&nbsp;

例えばShellオブジェクトのShellExecuteメソッドを使えばいいと書かれていても、自分

のようなまだVBAを勉強してから日が浅い初心者にはまだ理解できません。

&nbsp;

それらのコードについて書かれたコメントや感想などを読んでみると実際難しいようで

す。自分なりにVBEにコードを打ち込んでいって動作させようとしてもなかなか意図通

りには動いてくれません。

&nbsp;

もっと初心者でも簡単にPDFを自動で印刷できるコードはないものでしょうか。

&nbsp;

自分としては、この面倒で単調な作業をどうしても自動化したかったので粘り強く調べ

てみたらもしかしたらこれはいけるんじゃないか？と思えるものがありました。

&nbsp;

それがSendkeysメソッドというものです。
<h2>SendKeysメソッドとは</h2>
エクセルのVBAにおけるSendkeysメソッドとは、エクセルではなくエクセル以外の外

部アプリケーションなどにエクセルから指示が出せるコードです。

&nbsp;

一般的なイメージでは、エクセルのVBAというとエクセルの機能のひとつなのでエクセ

ル上でしか動作させることができないと思いがちです。しかしそうではなく例えばエク

セルからでもワードとかエクセル以外のアプリケーションでもエクセルから動作させる

ことができるのです。

&nbsp;

自分は最初このようなやり方があるのを知ったときは驚愕しました。「こんなやり方も

あるのか！？」と。詳しい内容についてはMicroSoftが以下のようなページを掲載して

います。
<ul>
 	<li><strong><a href="https://msdn.microsoft.com/ja-jp/library/cc364423.aspx">SendKeysメソッド</a></strong></li>
</ul>
<blockquote>キーボードから入力したときのように、1 つ以上のキー ストロークをアクティブなウィンドウに送ります。
<div id="code-snippet-1" class="codeSnippetContainer">
<div class="codeSnippetContainerCodeContainer">
<div id="CodeSnippetContainerCode_1dd13a61-a7b0-417c-8676-c8af870676c8" class="codeSnippetContainerCode" dir="ltr">
<div>
<pre>object.SendKeys(string)
</pre>
</div>
</div>
</div>
</div>
<h4 class="dtH4">引数</h4>
<dl>
 	<dt><em>object</em></dt>
 	<dd>WshShell<strong> </strong>オブジェクトです。</dd>
 	<dt><em>string</em></dt>
 	<dd>送信するキーストロークを文字列式で指定します。</dd>
</dl>
<h4 class="dtH4">解説</h4>
SendKeys<strong> </strong>メソッドは、オートメーション インターフェイスを持たないアプリケーションにキーストロークを送信する場合に使用します。キーボードの文字のほとんどは単一のキーで表現されます。キーボードの文字の中には、<strong>Ctrl</strong>+<strong>Shift</strong>+<strong>Home</strong> などのように、いくつかのキーの組み合わせで表現されるものもあります。キーボードの文字を 1 つ送信するには、その文字自身を <em>string</em> 引数に指定します。たとえば、<strong>X</strong> キーを送信するには、<em>string</em> 引数に文字列 "X" を指定します。</blockquote>
ShellオブジェクトとかOpenステートメント といったものは初心者には難しいかもし

れませんが、ショートカットキーの「Ctrl+P」などであれば難しくはないでしょう。

&nbsp;

そういった動作をエクセルから外部アプリケーションに指示を送れるのが、Sendkeys

メソッドです。

&nbsp;

例えばここまでPDFを印刷する手順について書いてきました。それをキーボードだけで

操作した場合どういった形になるでしょうか？それは以下のような形になります。

&nbsp;

PDFファイルを選択してenterを押す

↓

PDFファイルが画面上に表示されるので、Ctrl+Pのショートカットキーで印刷ダイアロ

グボックスが開く

↓

印刷ダイアログボックスが開かれている状態でenterを押すと印刷が実行される

↓

Alt+F4でPDFファイルを閉じる

&nbsp;

どうでしょうか。どのページを印刷するかといった特に込み入った設定が必要なければ

、マウスを操作しなくてもキーボード上のキーだけでPDFファイルを印刷することがで

きます。

&nbsp;

自分はこのやり方をエクセルからVBAを通してPDFへ指示を送れないかを試してみまし

た。

&nbsp;
<h2>folderfilelistとは</h2>
folderfilelistとはフリーソフトのひとつで、指定のフォルダの中にある全部のファイル

までのパスを全て抽出することができます。

&nbsp;

ファイルまでのパスがどう役に立つの？今回のPDFを印刷するマクロとどう関係がある

の？と思うかもしれませんが、使い方によっては本当に便利なんです。

&nbsp;

なぜファイルまでのパスを抽出できることが良いのかというと、コンピュータは、この

パスで指定のファイルがコンピュータ上のどこにあるのか、というのを理解できるから

です。

&nbsp;

&nbsp;

&nbsp;
<h2>ボタンひとつでPDFを印刷できるマクロのコード</h2>
&nbsp;

&nbsp;

&nbsp;
<h2>問題点と今後の課題</h2>
以上ここまで書いたやり方で「こんなやり方でもVBAでPDFを印刷できるようになりま

すよ」と言えればこれほど嬉しいことはないのですが、やはり問題点もあります。

&nbsp;

それは「コピペしたファイル名のファイルを全て印刷できるわけではない」という問題

です。今の時点では「なぜそうなってしまうのか」というのはわかりません。

&nbsp;

自分の中の仮説では「読み込み時間」の問題ではないかと思っています。

&nbsp;

VBAという分野には「OLEオートメーション」というやり方があります。これもエクセ

ル上から外部アプリケーションに対して何らかの動作をさせるための方法です。

&nbsp;

『VBAエキスパート公式テキスト ExcelVBAスタンダード 』という本には次のように書

かれています。
<blockquote>p.188

インターネットへの接続では、ページが完全に読み込まれるまでに時間が必要

だからです。ページの読み込みが完了する前にInnerTextプロパティの値を取

得しようとするとエラーになります。

&nbsp;

そこでページの読み込みが完了するまで処理を一時停止しなければなりませ

ん。これには、Do...Loopステートメントを使います。・・・</blockquote>
&nbsp;

もしかしたらこれだろうか？と思いました。エクセルからの指示が速すぎてPDFの方が

ついてこれていないのかも・・・。

&nbsp;

確かにPDFファイルをダブルクリックして画面上に完全に開かれるまでの時間とか印刷

ダイアログボックスが開くまでの時間、印刷を実行して印刷ダイアログボックスが閉じ

るまでの時間には若干の「タイムラグ」があります。

&nbsp;

う～ん。そういったタイムラグからエクセルからのPDFへの指示とその指示を実行でき

るタイミングに「ズレ」が生じてしまっているのではないか、というのが今の自分の仮

説です。

&nbsp;

じゃあそれを今すぐやってみればいいじゃないか、ということになるんでしょうが、い

ろいろ仕事で忙しいし、VBAについてもっと理解してからやりたいし、もう少しまとま

った時間の中でやりたいし・・・

&nbsp;

といった現在はちょっと怠慢な意識の状態です。うん・・・申し訳ないのですが、特に

急いでいるというわけでもないのでゆっくり進めていこうと思っています。
<h2>まとめ</h2>
世間一般では「スケジュール管理」とか「段取り」とか仕事をよりよくこなしていくた

めのキーワードとして使われているかと思います。もちろん自分もそういった点を意識

して仕事をしてはきました。

&nbsp;

とは言うもののそういった仕事のやり方に疑問を感じていたのも事実です。それはどう

しても「ミス」が出るからです。何かこう抜本的に根本的に今までやり方を覆せるよう

なやり方はないものかと考えてはいたのですが、そのような方法はそんな簡単には見つ

かるものでもありません。

&nbsp;

&nbsp;

&nbsp;

&nbsp;
<h2>あわせて読みたい</h2>
&nbsp;

&nbsp;