サーチ…


早期バインディングと遅いバインディング

バインディングは、オブジェクトを識別子または変数名に割り当てるプロセスです。早期バインディング(静的バインディングとも呼ばれます)は、Excelで宣言されたオブジェクトがワークシートやワークブックなどの特定のオブジェクト型である場合です。オブジェクトおよびバリアントの宣言型など、一般的なオブジェクトの関連付けが行われたときに遅延結合が発生します。

初期バインディングは、レイトバインディングよりもいくつかの利点を参照します。

  • 早期バインディングは、ランタイム中の後期バインディングよりも操作上高速です。実行時に遅延バインディングを使用してオブジェクトを作成すると、VBAプロジェクトが最初にロードされたときに早期バインディングが完了するまでに時間がかかります。
  • 初期のバインディングは、キー/アイテムのペアを順番に識別することによって、追加機能を提供します。
  • コード構造によっては、早期バインディングが追加のレベルの型チェックを提供し、エラーを減らすことがあります。
  • バインドされたオブジェクトのプロパティとメソッドを入力するときのVBEの大文字の修正は、初期バインディングでは有効ですが、レイトバインディングでは使用できません。

注:初期バインディングを実装するには、VBEのTools→Referencesコマンドを使用して、VBAプロジェクトへの適切な参照を追加する必要があります。
このライブラリ参照は、プロジェクトと共に運ばれます。 VBAプロジェクトが配布されて別のコンピュータで実行されているときに再参照する必要はありません。

'Looping through a dictionary that was created with late binding¹
Sub iterateDictionaryLate()
    Dim k As Variant, dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
    dict.comparemode = vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
    dict.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k
    
    dict.Remove "blue"      'remove individual key/item pair by key
    dict.RemoveAll          'remove all remaining key/item pairs

End Sub

'Looping through a dictionary that was created with early binding¹
Sub iterateDictionaryEarly()
    Dim d As Long, k As Variant
    Dim dict As New Scripting.Dictionary
    
    dict.CompareMode = vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
    dict.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    dict.Add Key:="White", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k

    'iterate through the keys by the count
    For d = 0 To dict.Count - 1
        Debug.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    'iterate through the keys by the boundaries of the keys collection
    For d = LBound(dict.Keys) To UBound(dict.Keys)
        Debug.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    dict.Remove "blue"                         'remove individual key/item pair by key
    dict.Remove dict.Keys(0)                   'remove first key/item by index position
    dict.Remove dict.Keys(UBound(dict.Keys))   'remove last key/item by index position
    dict.RemoveAll                             'remove all remaining key/item pairs

End Sub

ただし、アーリーバインディングを使用していて、参照しているライブラリの1つが欠落しているシステムでドキュメントを実行すると、問題が発生します。失われたライブラリを使用するルーチンは正しく機能しないだけでなく、ドキュメント内のすべてのコードの動作が不安定になります。そのコンピュータ上でドキュメントのコードが機能しない可能性があります。

これは、レイトバインディングが有利な場合です。レイトバインディングを使用する場合は、[ツール]> [参照]メニューに参照を追加する必要はありません。適切なライブラリを持つマシンでは、コードは引き続き動作します。ライブラリがないマシンでは、ライブラリを参照するコマンドは機能しませんが、ドキュメント内の他のコードはすべて引き続き機能します。

参照しているライブラリを熟知していない場合は、初期バインディングを使用してコードを記述し、展開前にレイトバインディングに切り替えると便利です。これにより、開発中にVBEのIntelliSenseとオブジェクトブラウザを利用することができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow