シート移動後はご用心

シートをオブジェクト変数に割り当てて、シートの移動をすると、そのオブジェクト変数は移動後どうなるでしょう?
どうも、それはやっちゃいけないことのようです。
 
試しに↓を実行すると、MsgBoxのところでエラーになります。

Sub Test()
  Dim shtA As Worksheet
  Set shtA = ThisWorkbook.Worksheets(1)

  Debug.Print TypeName(shtA)
  shtA.Move
  Debug.Print TypeName(shtA)
  MsgBox shtA.Name
End Sub

イミディエイトウィンドウ:

Worksheet
Object

 
これは、、、
シートを別ブックに移動すると、移動先のシートの(メモリ上の)アドレスは元のアドレスとは違うものになります。
オブジェクト変数というのは本質はポインタだから、shtA は移動先のアドレスを指すものになるわけがなく、移動元のアドレスももはやシートを指していないものとなってしまい、このような挙動をするんじゃないかと。
TypeName 関数で"Object"って返ってくるけど、それはアドレスが 0番地を指しているのではない!くらいの意味しかないのかもしれません。
それは、↓のマクロの結果から推測できます。

Sub Test2()
  Dim shtA As Worksheet
  Set shtA = ThisWorkbook.Worksheets(1)

  Debug.Print TypeName(shtA), ObjPtr(shtA)
  shtA.Move
  Debug.Print TypeName(shtA), ObjPtr(shtA)
  MsgBox shtA.Name
End Sub

 
尤も、私は普段こういうことやんないんですけどね。
 
なお、

  Dim shtA As Object
  Set shtA = ThisWorkbook.Sheets(1)

にしても同じ結果になります。
 
※.Excel World の 2007年3月6日 12:27 と 2007年3月9日 00:53 の日記を統合しています。
http://excel.sns.fc2.com/excel/