4.4 アーリーバインディングとレイトバインディング

アーリーバインディング(事前バインディング)、レイトバインディング(実行時バインディング)についても、多くの方がWeb上で説明してくださっていますが、一応記載しておきます。
アーリーバインディングをファストバインディング、レイトバインディングを遅延バインディングとも呼ぶように記憶しているのですが、出典がわからないため、一般的な用語を用いることにします。
VBA流に簡潔に説明すると以下のようになります。

・アーリーバインディングの例
  Dim App As Excel.Application
    Set App = Application

・レイトバインディングの例
  Dim App As Object
    Set App = Application
 これもレイトバインディングです。
 Dim App As Object
   Set App = CreateObject("Excel.Application")

違いは、変数宣言の型指定だけです。これだけで何が変わるの? と思われるかもしれませんが、違います!

違いを簡潔に説明すると、レイトバインディングの方がアーリーバインディングと比較して、処理が遅いのです。
と言っても、普通にプログラムしている限り、体感できるほどの差ではありません。ではどういうときに差が出るのか。
要は、レイトバインディングの変数の値を繰り返し呼び出し続けると、差が出てきます。
大量の処理を行わせる場合には、アーリーバインディングの方が望ましいというわけです。

上記例で例えば

  App.Calculate

とプログラムしたとしましょう。数式計算を行わせるメソッドです。
Object型で宣言した場合、Appに格納されているオブジェクトに、Calculateという名前のメソッドが存在するかどうかは、
実行された時にチェックされます。
これに対し、Excel.Application型で宣言した場合、変数の型は明示的に指定されているため、どのようなメソッドがオブジェクトに存在するかは、コンパイル時(初回実行時)にチェックされます。
プログラムしていると、不意に現れるプロパティやメソッドのリスト(インテリセンスと言います)は、アーリーバインディングの時には表示されますが、レイトバインディングの時には表示されません。この動作の違いは、この違いによるものです。
余談ですが、VBEのメニュー「デバッグ(D)」に「VBAProjectのコンパイル(L)」という項目がありますが、本来の意味でのコンパイルとは違うようです。P-CODEと呼ばれるコードを生成しているようです。このP-CODEは、VB4.0時代に用いられたもので、インタプリタのコードで動作も遅く、VB5.0以降はオプションで選択できるようになっていました。このコンパイルを通らない限り、どこかに記述ミスがあると考えてください。

Object型の落とし穴
Object型を使うと便利という方もいらっしゃると思いますが、思わぬ落とし穴があります。
メソッドやプロパティの存在チェックが実行時に行われるということは、存在しないメソッドをプログラムしても、実行してみるまでわからないということです。これは、プログラムをする上では大きなリスクです。
筆者はどうしてもレイトバインディングを使いたい場合、いったんアーリーバインディング形式でプログラムした後、変数の型をObject型に変更するようにしています。

CreateObject関数を使用する場合の注意点
一般にCreateObject関数を使ってオブジェクトを生成する場合は、オブジェクトを代入する変数はObject型、つまりレイトバインディングを使います。何故かというと、

  Dim App As Excel.Application
  Set App = CreateObject("Excel.Application")
  App.Visible = True

とした場合、変数宣言で使用したExcel.Applicationと、CreateObjectに指定したExcel.Applicationが合致するとは限らないのです。
いえ、普通に使用しているかぎり、Excel.Applicationの不一致は起こらないと思います。ここは例ということでご理解ください。たとえ同じメソッド、同じプロパティを持っているオブジェクトであっても起こりえます。筆者の経験では複数のバージョンのADOがインストールされている環境で発生しました。理屈は非常にややこしいので、他の項で説明しますが、不一致が起こったとしても、これはCOM(Component Object Model)の仕様によるもので、バグではありません。まあ、レジストリが壊れているということも、ありますが。ときどき。