VBA技術解説
事前バインディングと遅延バインディング(実行時バインディング)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2013-06-10 最終更新日:2019-12-21

事前バインディングと遅延バインディング(実行時バインディング)


マクロVBAでActiveXオブジェクトを操作する場合のVBA記述方法が2通りあります。
オブジェクトがオブジェクト変数に代入されるとき、事前バインディングと遅延バインディング(実行時バインディング)の2通りです。

バインディングとは

バインディングはbindingで、縛るとか束ねると言う意味の英単語です。
オブジェクトがオブジェクト変数に代入されるときにバインディングと呼ばれる処理を実行します。
記述方法の違いにより、事前バインディングと遅延バインディング(実行時バインディングとも呼びます)の2通りの方法があります。

事前バインディング

特定のオブジェクト型として宣言された変数に代入される場合、オブジェクトは事前(コンパイル時に)バインディングされます。
事前バインディングされたオブジェクトでは、アプリケーションが実行される前に、
コンパイラによってメモリの割り当てとその他の最適化が実行されます。
ただし、外部オブジェクトの場合は参照設定が必要になります。

遅延バインディング(実行時バインディング)

オブジェクトが Object 型として宣言された変数に代入される場合は、遅延(実行時)にバインディングされます。
この型のオブジェクトは、任意のオブジェクトへの参照を保持できますが、
事前バインディングされたオブジェクトの利点をほとんど持ちません。

実装(VBA記述)の違い

遅延バインディング

CreateObject関数を使用します。
・CreateObject関数の構文 ・CreateObjectの解説 ・CreateObject関数の使用例 ・GetObject関数

Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")


事前バインディング

「ツール」→「参照設定」で
「Microsoft Scripting Runtime」にチェックを付ける。

Dim objFSO As New FileSystemObject
または、
Dim objFSO As FileSystemObject
Set objFSO = New FileSystemObject


一言で言えば、
変数宣言の型が、Objectが遅延バインディング、特定のオブジェクト型が事前バインディング

事前バインディングの利点

可能な限り、事前バインディングされたオブジェクトを使用してください。
これによって、コンパイラは、アプリケーションをより効率的にする重要な最適化を実行できます。
事前バインディングされたオブジェクトは遅延バインディングされたオブジェクトよりも処理が高速です。
使用されているオブジェクトの種類が明確になるため、コードがより読みやすくなり、保守も簡単になります。
その他の利点として、自動コード補完機能が有効になり、プロパティ・メソッドの一覧を見る事が出来ます。

遅延バインディングの場合

Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExist(strDir) Then
  MsgBox ("指定のフォルダは存在しません")
  Exit Sub
End If

上のコードには、スペルミスがあります。

探すのは困難ですね。

実行時には、

マクロ VBA サンプル画像

マクロ VBA サンプル画像


事前バインディングの場合

Dim objFSO As FileSystemObject
Set objFSO = New FileSystemObject
If Not objFSO.FolderExist(strDir) Then
  MsgBox ("指定のフォルダは存在しません")
  Exit Sub
End If

実行時には、

マクロ VBA サンプル画像

もとより、事前バインディングの場合は、

マクロ VBA サンプル画像

このように入力候補がでるので、スペルミスはほとんどなくなります。

よほど特殊な事情が無い限り、事前バインディンクするようにして下さい。

参照設定の方法
VBEの画面で、「ツール」→「参照設定」
ここで必要なオブジェクトにチェックを付けます。

非常に多くのライブラリがあります。
正式な名称を知らずに、その場で探すことは困難です。
事前に正式なライブラリ名称を調べてから設定して下さい。




同じテーマ「マクロVBA技術解説」の記事

事前バインディングと遅延バインディング(実行時バインディング)
Dictionary(ディクショナリー)連想配列の使い方について
Dictionary(ディクショナリー)のパフォーマンスについて
VBAでのInternetExplorer自動操作
VBAでのSQLの基礎(SQL:Structured Query Language)
VBAで正規表現を利用する(RegExp)
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
VBAでのOutlook自動操作
ADO(ActiveX Data Objects)の使い方の要点
特殊フォルダの取得(WScript.Shell,SpecialFolders)
参照設定、CreateObject、オブジェクト式の一覧


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ