なぜiは変数の値が保持されるのに、wは保持されないのでしょうか?
Sub test()
Dim w As Worksheet
Dim i As Long
i = 1
For Each w In Worksheets
i = i + 1
Next
MsgBox i
MsgBox w.Name
End Sub
--------------------------------------
を行うと、
MsgBox i
は表示されるのに、
MsgBox w.Name
は、
「オブジェクト変数または With ブロック変数が設定されていません。」になります。
wはオブジェクト変数だから、
For Each ステートメントを抜けると値が破棄されてしまうのでしょうか?
でもvbaのヘルプの
「For Each...Next ステートメントの使い方」
を見ても
「ステートメントを抜けるとオブジェクト変数なら値が破棄されます」
と記載されていません。
ご質問のFor Each Nextの前に、ひとつ参考として
sub test
dim i
for i = 1 to 5
next i
msgbox i
end sub
と実行してみます。結果は(5じゃなく)「6」が現れます。
For To Nextフロー制御のルールは、Next行でエレメントがToを「超えた」時点で次行に制御を流します。
そこで、ご質問のFor Each Nextのヘルプを再度確認すると
「引数 group の中にもう要素がなくなったとき、ループは終了し、Next ステートメントの次のステートメントに実行が移ります」
のように解説されています。
つまりFor Each Nextでループを終了した時点で、変数Wは「もう何も入っていない」状態になってループを抜けています。(ローカルウィンドウで変数の中身を確認しながら追跡してみると、Nothingになってループを抜けている様子を見ることができます)
このため、ご質問の状況が発生します。
なお、ループの途中でExit Forによって(=Nextせずに)ループを抜けた場合などは、その時点のwの中身が保持されたままになります。
質問者
お礼
本当だ。
サンプルコードを実行してみたら、6になりました。
For Each...Nextで、ステートメントを無事終了して抜けると、値が破棄されて、
Exit Forで途中離脱すると、値が保持されたままなのですか。
Sub test()
Dim w As Worksheet
For Each w In Worksheets
Exit For
Next
MsgBox w.Name
End Sub
をやってみたら、エラーにならず、値が保持されてました。ありがとうございました。
お礼
本当だ。 サンプルコードを実行してみたら、6になりました。 For Each...Nextで、ステートメントを無事終了して抜けると、値が破棄されて、 Exit Forで途中離脱すると、値が保持されたままなのですか。 Sub test() Dim w As Worksheet For Each w In Worksheets Exit For Next MsgBox w.Name End Sub をやってみたら、エラーにならず、値が保持されてました。ありがとうございました。