ExcelVBAのWebBrowserとsetZoomでPDFを拡大縮小させる方法

「えっ!?こんな簡単なコードでいいの?」

 

少し前にExcelVBAのフォームのWebBrowserというコントロールを通してPDFを拡大や縮小できないかといろいろと試行錯誤していました。

 

もちろん自分にはそれまでそんな知識はなかったのでインターネットで調べながらコードの試行錯誤をしていたのですが、全く突破口が見えませんでした。それらしい情報もないことはないのですが、ちゃんとしたコードがどうしても見つけられませんでした。

 

これが本当に全くの偶然なのですが、とあるコードから簡単にPDFを拡大縮小できるようになったのです。

 

このことについて今回書いていってみます。

ExcelVBAから外部アプリケーションの操作は難しいし情報自体が少ない

ExcelVBAでExcelを操作するのであればそれほど難しくは感じないのですが、ExcelVBAから外部アプリケーションを操作するとなると勝手が違ってきます。その中でも「PDF」の操作はVBAの初心者にとっては難しいのではないでしょうか。

 

どうやらExcelVBAから外部アプリケーションを操作できるようになるためには、その外部アプリケーションの「オブジェクトモデル」の理解が必要なようで、これがいろいろと複雑で難しいのです。

 

ExcelやAccessは関連書籍があるのでまだいいですが、それ以外となるとそもそも本自体が少ない、もしくは売られていないしインターネット上での情報自体も少ないです。ですからExcelVBAからPDFを操作できるようにするには、基本的に手を使った「思考錯誤」が必要でした。

 

もちろんインターネット上に情報がないことはないのですが、「これは!」と思うような題名の記事があっても記事内に具体的なコードがないとか、あっても自分のような初心者から見ると非常に難解だったりとかあまり参考になりませんでした。

 

そんな状況で偶然ではありますが、ExcelVBAのフォームのWebBrowserというコントロールを通してPDFの拡大や縮小ができるコードを見つけたので今回整理していってみます。

ExcelVBAのWebBrowserでPDFを拡大縮小させるコード

結論としては次のコードになります。Excel2013で動作を確認しました。

Private Sub ScrollBar1_Change()
Dim P As Object
Set P = WebBrowser1.Document
P.setZoom (ScrollBar1.Value)
End Sub

このコードを解説すると、まずはVBEのプロジェクトエクスプローラーにフォームモジュールを挿入、挿入したフォームモジュール上にWebBrowserコントロールとスクロールバーコントロールを設置します。それからスクロールバーのChangeイベントプロシージャとして上記のコードを記述します。

 

2行目でオブジェクト型の変数Pを宣言します。3行目でWebBrowser1.Documentをオブジェクトとして変数Pに格納。4行目でWebBrowser1.Documentを格納した変数PをsetZoomメソッドの引数ScrollBar1の値から拡大縮小できるようにしています。

 

もちろんフォームを表示させる上で上記以外のコードも必要です。事前にユーザーフォームの初期設定としてUserForm_InitializeプロシージャからWebBrowserコントロールのNavigateメソッドを通してPDFを表示できるようしておく必要があります。

 

「WebBrowser」というぐらいですからWebとかInternetExplorerの画面を表示させる方法が一般的かと思いますが、自分のパソコンにあるPDFもパスを通して表示させることが出来ます。

 

ちなみにWebBrowserは最初の状態ではVBEのツールボックスからは選択できません。

 

そのため、ツールボックスを表示させたら右クリック、するとショートカットメニューが表示されます。その中の「その他のコントロール」を選択、「コントロールの追加」ダイアログボックスが表示された後、その中から「Microsoft Web Browser」を選択してください。

 

「コントロールの追加」ダイアログボックスから「Adobe Acrobat Dc Browser Contorol Implementation」とか「Adobe PDF Reader」というコントロールも選択は出来ます。

 

しかし、詳しいバージョンは忘れてしまったんですが、Excel2007かExcel2010のフォームで使おうとするとExcelファイルを開く時にどうしても警告メッセージが表示されてしまいます。

 

Application.DisplayAlerts = Falseを使えば大丈夫だろうと思ったのですが、このコードを使っても警告メッセージが表示されてしまいました。

 

これを出ないようにするは「レジストリ」の操作が必要になってくるようです。レジストリとはOSのWindowsの設定情報のデータベースであり、ここを操作するというのはパソコンの操作全般に影響が出てくるので注意が必要です。

 

ここを操作するということは、もしかしたら何らかの手違いでパソコンの調子がおかしくなってしまう可能性もあります。また、自分以外の人が使うかもしれないことを考えると、警告メッセージが出る度に毎回その人にパソコンのレジストリの操作をしてもらわなければいけなくなります。

 

以上のことを考慮すると「Adobe Acrobat Dc Browser Contorol Implementation」や「Adobe PDF Reader」コントロールの使用は却下せざるを得ません。

 

また、Excel2013の場合はフォームに設置しようとした時点で「要素が見つかりません」とメッセージが表示されて、そもそもコントロールが設置できませんでした。

 

そういう経緯もあってWebBrowserを使うという方法を考えました。

PDFを拡大縮小できるようにしようと思ったきっかけ

そもそもフォーム上からPDFを操作できるようにしたいと考えたきっかけは、PDFファイルの内容から名前を変更できるようにしたいと思ったからです。

 

PDFの中身の内容にある情報から判断してPDFファイル名を変更するとしたら一旦開く必要があります。しかし、ExcelVBAでPDFファイルを開く操作は出来ますが、開いた後のPDFの操作方法はその時の自分では思いつきませんでした。

 

上手く言えないんですが、一旦PDFを開いたら開いたPDFのコントロールを失うというか、それぞれ個別に判断したいんだけど、ある開いたPDFをクリックしたらその時にExcelから判断できるのか・・・

 

みたいな感じでとにかく処理方法とかどういったコードにすればいいか思いつかなかったんです。それで他に代替案はないか考えを巡らせていた所思いついたのが「フォームで表示させて操作する」という方法です。

 

この方法であれば、個別にPDFファイルを選択してフォーム上に表示させて操作できます。例えば「A」というPDFをフォーム上から表示させれば、「A」をコントロール下に置いた状態で操作できるようになります。

 

その状態であればそれぞれのPDFファイルを個別に判断して個別に操作できます。そこまでの考えには至ったのですが、それを「実現」させるための「コード」を見つけるのに非常に苦労しました。

 

また、PDFの内容からファイル名を変更する時に通常の倍率ではわからない時もあり得ます。もしくは一番最初に表示された時に文字が大きすぎるとか小さすぎるといった可能性もあります。

 

フォーム上からPDFを操作した時に発生すると考えられる問題の中のひとつに、内容が人によっては「見づらい」可能性も考えられたのでPDFも拡大縮小できるようにしたら利便性が上がるんじゃないかと考えました。

 

「フォームを使ってPDFを操作する」というアイデアは我ながら良いアイデアだとは思ったのですが、次の2点が問題でした。

  1. どうやってフォーム上にPDFを表示させるか
  2. フォーム上に表示させたPDFをどうやって操作するか

 

1については、それほど時間はかからずに解決策が見つかりました。冒頭でも書きましたが、インターネットで調べていたら「Web Browser」というコントロールが存在することを知ります。

 

これでWebBrowser1.Navigate ()というコードとPDFのパスを使うことでフォーム上にWebBrowserを通してPDFを表示させる所までは辿りつく事が出来ました。

 

他にも「Adobe Acrobat Dc Browser Contorol Implementation」や「Adobe PDF Reader」コントロールを使おうとした時に表示されたエラーメッセージや警告メッセージも表示されないので、このコントロールを使わない手はないと思いました。

 

問題は、2の「フォーム上に表示させたPDFをどうやって操作するか」です。

コメント