2015年12月30日水曜日

ワークシートを明示しないRangeオブジェクトの参照先

プロシージャの中でワークシートを明示せずにRangeオブジェクトを使った場合、どのワークシートのRangeオブジェクトが参照されるかの実験。

Sheet1とSheet2の各々のセル 'A1' に '名前' という名前のNameを作る。


Sheet1.Names.Add Sheet1!名前, =Sheet1!$A$1
Sheet2.Names.Add Sheet2!名前, =Sheet2!$A$1


そして、Sheet1モジュールに下記のプロシージャを書き、実行する。


Public Sub TestSheet1Proc()

    ' (1)
    Debug.Print Range("A1").Parent.Name
    ' (2)
    Debug.Print Cells(1, 1).Parent.Name
    ' (3)
    Debug.Print Range("名前").Parent.Name

End Sub


イミディエイト・ウインドに 'Sheet1' が3行出力される。
Sheet2モジュールのプロシージャから Sheet1.TestSheet1Proc を呼び出して実行したらどうなるか?
結果は変わらず、'Sheet1' が3行出力される。
ThisWorkbookモジュールからでも同様。

TestSheet1Proc を標準モジュール又はThisWorkBookモジュールにコピペして実行した場合、どうなるか?
結果はアクティブ・シートが何かで異なる。

Sheet1がアクティブの場合、'Sheet1' が3行出力される。
Sheet2がアクティブの場合、'Sheet2' が3行出力される。
Sheet3がアクティブの場合、'Sheet3' が2行出力されるが、(3)でエラーとなる。

Sheet3に '名前' という名前のNameを作ればこのエラーは出なくなる。

シート・モジュール内でワークシートを明示せずにRangeオブジェクトを使用した場合、常にそのシートのRange(セル)が参照される。

標準モジュールやThisWorkbookモジュールでワークシートを明示せずにRangeオブジェクトを使用した場合、アクティブ・シートのRange(セル)が参照される。



0 件のコメント: