業務でPDFを処理する時が多くあり、そのどれもが複数ページある、その中で確認する情報がいつも最初のページか最後のページにある場合、どのような操作をされているでしょうか。
マウスのホイールでスクロールさせるか、画面の端に表示されるスクロールバーをクリックした状態で上下させているというのが一般的ではないでしょうか。
毎回扱うPDFの枚数が数十ページ数百ページではその方法は大変でしょう。そんな時にボタンひとつで、もしくはPDFを表示する時に最初から最後のページが表示されるということであれば処理が楽になると思います。
そういった場合、PDFを利用した簡易的なシステムを作ろうと思っても参照設定とか、Adobe acrobatの複雑なオブジェクト構造における複雑なコードを記述するのは難しく大変です。
そんな時に、ExcelVBAのWebBrowserコントロールを利用するという形にはなりますが、簡単なコードでPDFを扱えるシステムが作れたらどうでしょうか。
今回はExcelVBAのWebBrowserでPDFの最初と最後のページを表示させる方法について整理していってみます
ExcelVBAのWebBrowserでPDFの最初と最後のページを表示させるコード
結論としてはExcelVBAの次のコードをフォームモジュール記述します。Excel2013で動作を確認しています。
Private Sub CommandButton1_Click() '最初 Dim P As Object Set P = WebBrowser1.Document P.gotoFirstPage End Sub Private Sub CommandButton2_Click() '最後 Dim P As Object Set P = WebBrowser1.Document P.gotoLastPage End Sub
「gotoFirstPageメソッド」と「gotoLastPage メソッド」を使うことで、フォームに設置したWebBrowserコントロールにPDFの最初のページと最後のページを表示させることができます。
上記のコードを解説すると大きく2つのプロシージャに分けられます。一つ目はコマンドボタン1のクリックイベント、二つ目はコマンドボタン2のクリックイベントです。
一つ目のプロシージャの2行目でオブジェクト型の変数Pを宣言。3行目のWebBrowser1.Documentをオブジェクト型変数Pに格納。4行目のP.gotoFirstPageで、WebBrowser1コントロールに表示されているPDFが複数ページあって1ページ目以外を表示していた場合、最初のページが表示されるようになっています。
二つ目のプロシージャも基本的に流れは同じです。
「Private Sub CommandButton2_Click() ‘最後」が6行目だとします。7行目でオブジェクト型の変数Pを宣言。8行目のWebBrowser1.Documentをオブジェクト型変数Pに格納。
9行目のP.gotoLastPageでWebBrowser1コントロールに表示されているPDFが複数ページあって、最後のページ以外を表示していた場合、最後のページが表示されるようになっています。
上記のコードを実行する前に、InitializeイベントやWebBrowserコントロールのNavigateメソッドなどで事前にPDFが表示されるようにコードを記述してからの方がやりやすいかと思います。
WebBrowserコントロールはExcelVBAのツールボックスから最初から選択できるわけではありません。このコントロールを使えるようにするための設定方法、それ以外のコントロールを使う場合の問題点などは以下の過去記事で簡単に整理しています。
上記のコードはコマンドボタンのクリックイベントで使っていますが、別にフォームのInitializeイベントの部分で最初から最後のページが表示されるようにしてしまっても構いません。
もしくはスピンボタンで表示するPDFを切り替える時などに同時に最初、もしくは最後のページも表示できるようにする、というコードにしても構いません。
その人が使う時に一番使いやすい形でコードが記述されているのが一番だと思います。
他にもWebBrowserコントロールや他の各キーワードの説明については以下の過去記事で整理しています。
まとめ
今回の記事を書く前に、ここまでで以下の過去記事も書いています。
ExcelVBAでPDFを扱おうとしたけれども、自分の知識ではどうしてもできませんでした。しかしWebBrowserコントロールをオブジェクト変数を通して使う、という方法であれば操作できるようになりました。
もちろん直接PDFを操作できるような知識を持っている事が一番だと思います。けれどもAccessやOutlook、WordやMicrosoft以外のアプリケーションを操作する時などExcel以外の外部アプリケーションを操作するとなってくると勝手が違ってきます。
ExcelVBA以外のアプリケーションを操作するとなると、そのアプリケーション固有の「オブジェクトモデル」といったそのアプリケーション独特の文法やルールを理解しないといけません。そうしないとそのアプリケーションでさせたい動作のコードが記述できないからです。
それらを全て理解するというのは、素人にはなかなか難しいものです。今回見つけたオブジェクト変数を通してWebBrowserコントロールを利用するというのは、オブジェクトモデルの理解の必要性を一部分かもしれませんが吸収してくれたと思います。
ここまで
- 「setZoom」でWebBrowserコントロールに表示されるPDFを拡大して表示させる方法
- 「setZoomScroll」でWebBrowserコントロールに表示されるPDFの表示される部分を指定の箇所にできる方法
- 「gotoFirstPage」と「gotoLastPage 」でWebBrowserコントロールに表示されるPDFの最初のページと最後のページを表示できる方法
を確認してきました。
ここまで確認してきた方法を組み合わせることはもちろん、それ以外の処理でもWebBrowserコントロールを利用してPDFの操作方法について試行錯誤してみると、より効率的に処理できるシステムを作れるかもしれません。
後書き
今回の記事を書いている途中で思いついたことがあります。
それは、オブジェクト変数を通してWebBrowserコントロールを利用するという風に、何らかの「クッション」を経由するのであれば各アプリケーションごとのオブジェクトモデルの理解がそれ程なくても簡単なコードでその人の考えを実現できる、といった方法は他にないものかなと。
例えばOutlookはExcelと比べると階層が深いオブジェクトモデルになっているというか、ExcelVBAから操作しようとすると事前に色々と記述しなければいけないコードが必要になってきます。
ExcelVBAからOutlookでメールを送信する時にこういった操作をする、という場合、ExcelVBAにその人の考えるイベント処理がなければ「WithEvents」などを使って、イベントそのものを作らなければいけなくなってきます。
こうなってくるとさらに「クラスモジュール」を扱う知識が必要になってくるのですが、こういった時に「何か」を経由するともっと楽にコードが記述できる、といった方法はないものかなと考えたりもしました。
今の所その「何か」は見つかってはいませんが、今後勉強を進めていけば見つかるのかもしれません。





















コメント