アーリーバインディング
ツール → 参照設定で対象ライブラリを選択し、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
まとめ
バインディング方式の選択は「誰が使うか」で決まります。自分だけのツールならアーリー、他者への配布物ならレイトを選ぶのが原則です。