シート移動後はご用心
シートをオブジェクト変数に割り当てて、シートの移動をすると、そのオブジェクト変数は移動後どうなるでしょう?
どうも、それはやっちゃいけないことのようです。
試しに↓を実行すると、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/