excel-vba When To Use ActiveWorkbook and ThisWorkbook
Example
VBAコードが参照するワークブックを常に指定することは、VBAのベストプラクティスとなっています。 この指定が省略された場合、VBA はコードが現在アクティブなワークブック (ActiveWorkbook
) に向けられていると見なします。
'--- the currently active workbook (and worksheet) is impliedRange("A1").value = 3.1415Cells(1, 1).value = 3.1415
しかしながら、複数のワークブックが同時に開いている場合 – 特に、VBA コードが Excel アドインから実行されている場合 – ActiveWorkbook
への参照は混乱したり誤った方向に向かったりする可能性があります。 たとえば、時刻をチェックし、アドインのワークシート(通常、ユーザーからは見えません)に保存されている値と比較する UDF を持つアドインは、どのワークブックが参照されているかを明示的に特定する必要があります。 この例では、開いている(そしてアクティブな)ワークブックのセルA1 =EarlyOrLate()
に数式があり、そのアクティブなワークブック用に書かれたVBAは存在しません。 アドインには、次のユーザー定義関数 (UDF) があります:
Public Function EarlyOrLate() As String If Hour(Now) > ThisWorkbook.Sheets("WatchTime").Range("A1") Then EarlyOrLate = "It's Late!" Else EarlyOrLate = "It's Early!" End IfEnd Function
UDF のコードは、インストールされた Excel アドインに書き込まれ保存されます。 UDFは、アドイン内の「WatchTime」というワークシートに保存されているデータを使用します。 もしUDFがThisWorkbook
の代わりにActiveWorkbook
を使用していたら、どのワークブックが意図されたものかを保証することはできないでしょう。