今日は勉強していて気になっていた事を調べてみた。
気になっていた事は、RangeオブジェクトがIs演算子で比較できないと言う事。
まずWorksheetオブジェクトから。
Sub test()
Dim 変数A As Worksheet
Set 変数A = Worksheets(1)
Dim 変数B As Worksheet
Set 変数B = 変数A
Dim 変数C As Worksheet
Set 変数C = Worksheets(1)
Debug.Print 変数A Is 変数B '→ True
Debug.Print 変数A Is 変数C '→ True
Set 変数C = Worksheets(2)
Debug.Print 変数A Is 変数C '→ False
End Sub
オブジェクト変数のA~Cにそれぞれ「Worksheets(1)」を格納。
29行目と30行目でIs演算子で判定している。
結果は全てTrue。
まあ当たり前か。
次にRangeオブジェクト。
Sub test()
Dim 変数A As Range
Set 変数A = Range("A1")
Dim 変数B As Range
Set 変数B = 変数A
Dim 変数C As Range
Set 変数C = Range("A1")
Debug.Print 変数A Is 変数B '→ True
Debug.Print 変数A Is 変数C '→ False
End Sub
オブジェクト変数のA~Cにそれぞれ「Range("A1")」を格納。
52行目と53行目でIs演算子で判定している。
結果は「変数A Is 変数B」がTrueで、「変数A Is 変数C」がFalse。
なぜ??
理由が全然分からなかったからネットで調べてみた。
するとあるサイト内に以下の事が書かれていた。
--------------------------------------------------------------------------------
RangeオブジェクトがIs演算子で比較できない理由
結論から言うと、Rangeオブジェクトは以下のような動きをするためです。
▼RangeオブジェクトがIs演算子で比較できない理由
Rangeオブジェクトは取得されるごとに違うメモリアドレスに格納されるため
--------------------------------------------------------------------------------
実際に見てみないと分からないので確認してみた。
Sub test()
Dim 変数A As Range
Set 変数A = Range("A1")
Dim 変数B As Range
Set 変数B = 変数A
Dim 変数C As Range
Set 変数C = Range("A1")
Debug.Print ObjPtr(変数A)
Debug.Print ObjPtr(変数B)
Debug.Print ObjPtr(変数C)
End Sub
ObjPtr関数は、オブジェクトのメモリアドレスを返す関数なので各変数のメモリアドレスをイミディエイトウィンドウに出力。
結果は…
変数A 340722416
変数B 340722416
変数C 340723472
変数Cだけ違うメモリアドレスだった。
Is演算子で判定した時に、メモリアドレスで判定するのであれば当然変数Cだけ違うメモリアドレスなので結果は見えている。
--------------------------------------------------------------------------------
Is演算子は、メモリアドレスが同じかどうかによって比較を行う演算子なのでしょう。
--------------------------------------------------------------------------------
みたい。
でもこれでRangeオブジェクトがIs演算子で比較できない理由が分かった。
今日も1つ勉強になった。