アーリーバインディング

ツール → 参照設定で対象ライブラリを選択し、Dim 時に具体的な型名を指定します。

VBA — アーリーバインディング(Dictionary)
' 参照設定: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 型で変数を宣言します。

VBA — レイトバインディング(Dictionary)
' 参照設定不要
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等)が使えません。ConstEnum で自前宣言して対処します。

VBA — 定数の自前宣言
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

まとめ

バインディング方式の選択は「誰が使うか」で決まります。自分だけのツールならアーリー、他者への配布物ならレイトを選ぶのが原則です。

次の章では…

PART 09 では 正規表現 を解説します。VBScript.RegExp のレイトバインディングで柔軟なパターンマッチングを実現します。

→ PART 09 — 正規表現へ