配布先のPCで「オブジェクトが見つかりません」というエラーが出て初めて、参照設定に依存したアーリーバインディングの怖さを知りました。レイトバインディングへの切り替えで解決した経緯を残しています。
アーリーバインディング
図1: アーリーバインディング vs レイトバインディング
ツール → 参照設定で対象ライブラリを選択し、Dim 時に具体的な型名を指定します。
' 参照設定:Microsoft Scripting Runtime にチェック済みの場合
Option Explicit
Sub EarlyBindingExample()
' 具体的な型名で宣言 → IntelliSense が効く
Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary
dict.Add "key1", "value1"
Debug.Print dict("key1")
Set dict = Nothing
End Sub
✅ アーリーバインディングのメリット
① IntelliSense(コード補完)が効く
② コンパイル時に型チェックされる
③ 実行速度がわずかに速い
レイトバインディング
参照設定なしで CreateObject を使い、Object 型で変数を宣言します。
' 参照設定不要
Option Explicit
Sub LateBindingExample()
' Object 型で宣言 → IntelliSense は効かない
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "key1", "value1"
Debug.Print dict("key1")
Set dict = Nothing
End Sub
比較と使い分け
| 項目 | アーリーバインディング | レイトバインディング |
|---|---|---|
| 参照設定 | 必要 | 不要 |
| IntelliSense | あり | なし |
| コンパイル時チェック | あり | なし(実行時エラー) |
| 配布・環境依存 | 参照DLLのバージョン差で問題が起きる場合あり | ProgIDが存在すれば動く |
| 推奨シーン | 開発中・社内専用マクロ | 不特定多数への配布物 |
💡 開発はアーリー、配布はレイト
開発中は参照設定ありのアーリーバインディングで効率よく書き、配布時にレイトバインディングに書き換えるワークフローが実用的です。
自前での定数・列挙体宣言
レイトバインディングではライブラリ定義の定数(例:msoFileTypeAllFiles等)が使えません。Const や Enum で自前宣言して対処します。
Option Explicit
' ライブラリ定数を自前で定義(レイトバインディング対応)
Private Const adOpenStatic As Long = 3
Private Const adLockReadOnly As Long = 1
Private Const adCmdText As Long = 1
' Enum で関連定数をグループ化
Private Enum FileDialogType
fdtOpen = 1
fdtSaveAs = 2
fdtFolder = 4
End Enum
Sub OpenDbWithLateBinding()
Dim conn As Object
Dim rs As Object
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "接続文字列"
rs.Open "SELECT * FROM T_Data", conn, adOpenStatic, adLockReadOnly, adCmdText
' ... データ処理 ...
rs.Close: conn.Close
Set rs = Nothing: Set conn = Nothing
End Sub
バインディング関連でよくある問題
実際の開発・配布時に遭遇しやすいトラブルと対処法を整理する。
| 問題 | 原因 | 対処 |
|---|---|---|
| 別PCで「参照設定が見つかりません」エラー | アーリーバインディングで参照しているDLLのバージョンや場所が異なる。Officeのバージョン差が多い | 配布用ファイルはレイトバインディングに書き換える。または参照先のDLLバージョンを統一する |
| レイトバインディングでIntelliSenseが効かず入力ミスが多い | Object型で宣言しているとVBEはメンバ候補を補完できない | 開発中はアーリーバインディングで書き、配布前にレイトバインディングに切り替える二段階ワークフローを使う |
| ライブラリ定数がレイトバインディングで使えない | 定数(例:xlCellTypeLastCell)はライブラリ参照があって初めて解決される |
使用する定数をモジュール先頭でConstまたはEnumとして自前宣言する |
| アーリーバインディングのコードをレイトに変換し忘れて配布 | 自分の環境では動くが受取側でエラーになる典型パターン | 配布前チェックリストに「参照設定を外す→全モジュールをコンパイル→エラーがないこと確認」を入れる |
まとめ
バインディング方式の選択は「誰が使うか」で決まります。自分だけのツールならアーリー、他者への配布物ならレイトを選ぶのが原則です。