• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:なぜiは変数の値が保持されるのに、wは保持されない)

なぜiは変数の値が保持されるのに、wは保持されないのでしょうか?

このQ&Aのポイント
  • VBAのFor Eachステートメントを使用してワークシートのオブジェクトを反復処理する中で、オブジェクト変数wの値が保持されない理由について質問です。
  • ワークシートのオブジェクト変数wはFor Eachステートメントのスコープ内でしか有効ではなく、ステートメントを抜けると値が破棄されるため、後続のMsgBoxでエラーが発生します。
  • VBAのヘルプドキュメントにはこの動作について明確に記載されていないため、混乱することがありますが、オブジェクト変数の有効範囲はスコープ内に限定されるので注意が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

ご質問の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の中身が保持されたままになります。

KOVI65483
質問者

お礼

本当だ。 サンプルコードを実行してみたら、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 をやってみたら、エラーにならず、値が保持されてました。ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • YUI_AI
  • ベストアンサー率45% (303/661)
回答No.1

下記URL等を参考にされると良いと思います。 http://msdn.microsoft.com/ja-jp/library/vstudio/5ebk1751.aspx 「element のスコープはループの本体になります」等の記述から判ると思いますが、wの保持される期間はルール終了までとなります。

KOVI65483
質問者

お礼

「element のスコープはループの本体になります」 =「wの保持される期間はルール終了まで」と読み替えればいいのですか。 URLよく読んでみます。ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A