<img class="alignnone wp-image-2641" src="https://www.chishikinosoukonoseiri.com/wp-content/uploads/2018/01/code-820275_640-300x200.jpg" alt="" width="608" height="405" />

今回の2つ前に以下のような過去記事を書いています。

<strong><a href="https://www.chishikinosoukonoseiri.com/entry/2018/01/20/0951">SendKeysメソッドとFolderfilelistでPDFを自動印刷できないか</a></strong>

&nbsp;

エクセルのVBAでSendkeysメソッドとフリーソフトのFolderfilelistでPDFを自動で

印刷できるマクロをつくろうと試みたのですが、思うように動作せずに失敗したと

いった内容です。

&nbsp;

考えられる理由として、エクセルからPDFへSendkeysメソッドで指示を送れるよう

にしていたが、指示が速すぎてPDFが表示される前に送ってしまっていたのではない

かということでした。

&nbsp;

その解決策として、VBAのコードにAPIのkernel32を利用してみました。今回のこの

部分で試行錯誤した内容について書いていってみます。
<h2>VBAにおけるAPIとは、kernel32とは</h2>
過去記事の課題をなんとかするために、何か良い方法はないかとインターネットを使

って調べていたら、「これはいけるんじゃないか？」と感じられたものがありました。

&nbsp;

それは「APIのkernel32」です

&nbsp;

冒頭の過去記事で書いたコードに、今回はAPIのkernel32というコードを利用してみ

ました。ではAPIのkernel32とはどんなコードなのでしょうか。自分の勉強という意

味でも備忘録という意味でもちょっと引用してみます。

&nbsp;

『VBAエキスパート公式テキスト Excel VBA スタンダード』には次のように書かれ

ています。
<blockquote>p.191

APIとはApplication Programming Interfaceの略称です。APIは、Windows

などが持っている機能のうち、外部に公開している関数などで、VBAなど他の

プログラムから利用できます。

&nbsp;

一般的に、APIとはWindowsのAPIを差しますが、機能をAPIとして公開できる

のはWindowsに限りません。そのほかのプログラムでも、機能の一部をAPIと

して公開しているものがあります。そのように外部に公開している機能や関数

などを「ライブラリ」と呼びます。

&nbsp;

プログラム自身を操作するOLEオートメーションとは異なり、APIは公開され

ている機能や関数だけを呼び出して実行します。両者は、Excel VBAによるプ

ログラミングの中でも、高度な部類に入ります。しかし適切に使いこなせれ

ば、VBAだけでは難しい機能を実現できます。</blockquote>
&nbsp;

同様に本書においてkernel32は次のように書かれています。
<blockquote>ｐ.191

「Declare Function GetTickCount Lib "kernel32"()As Long」は、

<strong>kernel32</strong><strong>というライブラリが公開している</strong>GetTickCountという関数を使用

するための宣言です。</blockquote>
APIとは、要はVBAで使えるいろんなコードの種類の中のひとつといったところでし

ょうか。Kernel32というのは「Kernel32というライブラリ」とあるので、そういっ

た種類のコードがまとめられている所があるということでしょう。

&nbsp;

ちなみにAPIを使用するには、どのライブラリの、どの関数を使うかを予め宣言しな

ければならず、そのためには宣言セクションでDeclareステートメントを使う必要が

あります。変数の宣言に似ています。

&nbsp;

今回はこのコードを使って、前回の課題だった読み込み時間中にエクセルに待機さ

せるという指示が出せるか試してみます。
<h2>Sleep関数を利用して自動で印刷できるようにしたコード</h2>
冒頭部分の過去記事で書いたコードにAPIのkernel32のコードを利用してつくったの

が以下のコードになります。
<blockquote><strong>Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)</strong>

Sub 印刷()

<strong>Dim time As Long</strong>
<strong>time = 1500</strong>

Dim i As Long

Dim buf As String

On Error Resume Next

Range("F7").Select

Range("F7").Value = "=VLOOKUP(RC[-4],パス!C[-5]:C[3],9,0)"

Selection.AutoFill Destination:=Range("F7:F100"), Type:=xlFillDefault

For i = 7 To 100

If Cells(i, 2) &lt;&gt; "" Then

Cells(i, 6).Hyperlinks.Add Anchor:=Cells(i, 6), Address:=Cells(i, 6).Value

Cells(i, 6).Hyperlinks(1).Follow

<strong>Sleep time</strong>

SendKeys "^{p}"

<strong>Sleep time</strong>

SendKeys "{enter}"

<strong>Sleep time</strong>

SendKeys "%{F4}"

End If

Next i

Range("F7:F100").Delete

End Sub</blockquote>
&nbsp;

上のDeclareステートメント内とコード中には「Sleep関数」というものを使っていま

す。Sleep関数とは指定した時間(ミリ秒間)だけ処理を中断できる関数です。例えばコ

ードに中に「1000」と入れれば1000ミリ秒、つまり1秒間、「待ち」の時間をつくる

ということです。

&nbsp;

このSleep関数を
<ul>
 	<li>PDFが開かれる前</li>
 	<li>PDFが開かれて「Ctrl+P」で印刷ダイアログボックスが開かれる前</li>
 	<li>印刷ダイアログボックスが開かれてenterが押された後</li>
</ul>
に「待機」の時間をつくることで、エクセルからの指示を対応できるようにしました。
<h2>結果と感想</h2>
とりあえず形にはなったかな、という感じです。過去記事ではPDFファイルが開かれる

までに若干のタイムラグがあり、その間にエクセルがSendkeysメソッドで指示を送っ

てPDFが開かれていないので対応できない、という課題がありました。

&nbsp;

しかし、今回見つけたコードを入れることで「待ち」の時間をつくることができ、PDF

が開いてから指示を送れるようになりました。

&nbsp;

それによってある程度は理想的な動きをしてくれるようにはなったのですが、問題は

「ちょっと時間がかかってしまう」ことだと感じています。

&nbsp;

VBAでマクロをつくるんだから、一瞬で作業を終わらせてしまう、とは言わないまで

ももうちょっと何とかならないかなぁと思いました。

&nbsp;

特に数が印刷する数が増えれば増えるほどより時間がかかってしまいます。自分は

VBA初心者なのでまだこういったコードしか書けませんが、たぶんもっと汎用性があ

って便利なコードはあるはずです。

&nbsp;

実際インターネットでいろんなコードを見てみると、難しそうなコードをたくさん目

にしますし。そのようなコードが理解できるように、自分は今後も勉強が必要だと感

じました。
<h2>あわせて読みたい</h2>
<ul>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2018/01/27/0424">CONCAT関数と検索ボックスを利用してPDFを一括印刷するVBAとマクロ</a></strong></li>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/12/31/0830">業務を自動化できる技術を持たないと自動化される時代が来るかもしれない</a></strong></li>
 	<li><strong><a href="https://www.chishikinosoukonoseiri.com/entry/2017/12/03/0104">人間世界における勉強の概念の今後の1つの方向性について</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/04/2026">RPAツールが一般化されればプログラミング言語の知識は不要になるのか</a></strong></li>
</ul>