Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA OLEオートメーションで別のアプリケーションを動かす② OLEで他のアプリケーションを動かすコードの作り方 Internet Explorerの例

OLEの概念が分かったところで、実際にOLEでエクセル以外のアプリケーションを動かすプログラムを作っていきましょう。

この記事は二段です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

この記事はオブジェクト指向の概念とOLEの概念を理解していることを前提に話を進めます。よく理解できていない方はサンプルコードのコピペで終わることになってしまうので、まずは、VBAのクラスを使う① クラスを使うためのオブジェクトとメソッドの前提知識でクラスとオブジェクトの概念を復習しておきましょう!

目次

事前バインディングと実行時バインディング

OLEで他のアプリケーションを動かす為には、バインディングという作業が必要です。まず、このバインディングという作業について解説します。

バインディングとは

クラスとはオブジェクトを定義する為の仕様書とか設計図のようなものでした。そのままでは使えないので標準モジュールで、インスタンスを生成してから使っていましたよね。

今回は他のアプリケーションのクラスを使うので、いきなり、

Dim 新しいオブジェクト As 新しいクラス

ってやっても、エクセルさんからしたら「誰ソレ?」状態になります。ちょっと実験します。

Sub そんなクラスありません()

    Dim 新しいオブジェクト As 新しいクラス

End Sub

実行して出たエラーがメッセージが下記のものです。

そんなクラスありません、のエラー
そんなクラスありません、のエラー

「ユーザー定義型は定義されていません」っていうのは、エクセルさんが知らない型で変数が宣言されていたので、クラスモジュールで型が定義されているかと思ったら、それも定義されていませんでした、と言う事です。つまり、そんなクラスありませんって事です。

今回はエクセルアプリケーション以外のクラスを使うので、いきなりインスタンスを生成しようとしても同じ事が起きます。

そこで、他のアプリケーションのクラスをエクセルさんに教えてあげる作業が必要となります。これが、バインディングという作業です。インターネットで検索して出てくる「オブジェクトの参照」というのは、この「他のアプリケーションのクラスをエクセルさんに見せてあげる事」です。

ん?「オブジェクトの参照??」と思った人は鋭いです。「クラスの参照じゃないの??」

実は事前バインディングと実行時バインディングは、意味が違います。

事前にオブジェクトを参照する事前バインディングと参照と同時にインスタンスを生成する実行時のバインディング

事前バインディング

予めエクセルさんにオブジェクトを参照してもらう方法です。オブジェクトを参照しているので、

Dim 新しいオブジェクト As 新しいクラス

と書いただけで、「新しいクラス」型の「新しいオブジェクト」が使えます。事前バインディングは予め参照させるので、エクセルアプリケーションの設定が必要です。でも作ったプログラムって大抵、配布しますよね。配布するのはエクセルアプリケーションでは無く、エクセルのマクロブックです。と言う事はユーザーが自分でエクセルの設定を変更しなくてはなりません。これは、配布するプログラムとしては失格ですね。以下で、実行時バインディングを解説します。

★事前バインディングはエクセルさんがクラスを知っているので、そのメンバー(メソッドとプロパティ)の入力補助が出るので便利です。事前バインディングでコーディングして、配布前に実行時バインディングを使うのもアリだと思います

実行時バインディングでOLEを利用する

それでは、実行時バインディングでOLEを使うプログラムを作っていきましょう。今回はInternet Explorerのクラスをお借りして、オブジェクトを生成し、利用します。

普通にクラスを作るときと違って、一旦Object型で変数を宣言する

自分でクラスモジュールでクラスを作るときは、そのクラス名がオブジェクトの型名になるんでしたよね。今回は、自分でクラスを作るわけではないので、一旦、Object型で変数を宣言します。

Sub インターネットを使う()

    Dim インターネットエクスプローラー As Object

End Sub

ネットとか文献の解説だと変数名が「IE」になっていると思います。この変数名じゃないと行けないのかと勘違いしてしまうかもしれないので、日本語にしました。自分でコーディングする場合は、書きやすいように変数名は「IE」などとして下さいね。記事内のサンプルはわかりやすさ重視で日本語にしているだけです。

事前にオブジェクトを参照しないので、自分でインスタンスを生成する

実行時バインディングではオブジェクトの参照をしていません。じゃあ、どうするかというと、インスタンスを生成すると同時にクラスを参照するCreateObject関数を使います。引数に参照したいクラスのアプリ名を取って、その引数名のオブジェクトを戻します。(すげー!)

Sub インターネットを使う()

    Dim インターネットエクスプローラー As Object
    Set インターネットエクスプローラー = CreateObject("InternetExplorer.Application") '←コレを追記
    
End Sub

「インターネットエクスプローラー」と言うObject型の変数を宣言してから、その変数にCreateObject関数に「InternetExplorer.Application」を渡した戻り値を格納しています。これで、「インターネットエクスプローラー」をInternetExplorer.Applicationとして使う事ができるようになりました!!

なんとか、IEのメソッドを調べる

自分で作ったクラスではないのでメソッド名が全然分かりません。自分で調べるしかないです。二段以上は、メソッド名やプロパティ名を公式ドキュメントで調べる力がコーディングの実力に影響してきます。

Microsoftの開発者向け公式ドキュメントでなんとかInternet Explorerを調べると、Internet Explorerの公式ドキュメントを見つけることができました。

ここからが大変なのですが、なんとかインターネットエクスプローラーというブラウザを開くメソッドを調べてたどり着こうとします。

フムフム読んでそれっぽいのを調べるとnavigate methodにたどり着きました。

やっとたどり着いたnavigateメソッドの説明
やっとたどり着いたnavigateメソッドの説明

画面の上の方に「もう定期更新はしません」って書いてあるのが気になりますね。Edgeをすいしょうしているからなんでしょうけど、OLEの説明なので、もうこのまま解説続けちゃいます。

Syntax(文法。プログラムの構文、書き方のこと)に「object.navigate(url);」と書いてあります。セミコロンがついているのはC++という別のプログラミング言語でこのメソッドを書く時の例なので無視します。

Sub インターネットを使う()

    Dim インターネットエクスプローラー As Object
    Set インターネットエクスプローラー = CreateObject("InternetExplorer.Application") 

    インターネットエクスプローラー.Visible = True '←コレを追記
    インターネットエクスプローラー.navigate ("https://www.mutable.work/contents-index") '←コレを追記
    
End Sub

ふう、やっとできました。さりげなくインターネットエクスプローラー.Visible = Trueを挿入しています。これはブラウザを表示させています。これで、このブログのまとめページを開くプログラムが完成しました。

OLEを利用した具体的な手順はわかりましたか?コード自体はオブジェクト指向とOLEの概念が分かっていれば難しくありませんね。大変なのは、メソッド名やプロパティ名を調べるところです。

調べる方法については、次回解説します。頑張っていきましょう!