Page 65 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼どうして永久ループになってしまうのでしょう? カド 02/9/11(水) 14:58 ┣Re:どうして永久ループになってしまうのでしょう? bebe 02/9/11(水) 15:15 ┃ ┗Re:どうして永久ループになってしまうのでしょう? カド 02/9/11(水) 16:22 ┗再帰 yu-ji 02/9/11(水) 15:17 ┗Re:再帰 カド 02/9/11(水) 15:36 ┗Re:再帰 yu-ji 02/9/11(水) 16:01 ┗Re:再帰 カド 02/9/11(水) 16:17 ┗Re:再帰 つん 02/9/11(水) 16:43 ┣Re:再帰 カド 02/9/11(水) 16:54 ┗Re:再帰 yu-ji 02/9/11(水) 17:18 ─────────────────────────────────────── ■題名 : どうして永久ループになってしまうのでしょう? ■名前 : カド ■日付 : 02/9/11(水) 14:58 -------------------------------------------------------------------------
再帰というものが理解できてません。 以下のプログラムはどうして、止まらないのでしょう? 教えてください。 Sub a() Range("a1") = Range("a1") + 1 For n = 1 To 5 a Next n End Sub |
▼カド さん:こんにちは。 >Sub a() > Range("a1") = Range("a1") + 1 > > For n = 1 To 5 > a > Next n > >End Sub これだと、For文のaで自分自身を呼び出していますよね? そこで無限ループになってしまいます。 ところで、どのような処理をさせようとしているのでしょうか?? |
▼bebe さん: レスありがとうございます。 やりたかったのは、再帰を使ってサブフォルダ内のファイル一覧を作成する等のプログラミングを勉強しようとしてました。 また、よろしくおねがいします。 |
▼カド さん: >再帰というものが理解できてません。 >以下のプログラムはどうして、止まらないのでしょう? >教えてください。 > >Sub a() > Range("a1") = Range("a1") + 1 > > For n = 1 To 5 > a > Next n > >End Sub 1:関数aを実行 2:A1に1をプラス 3:変数Nに1を入れる 4:関数aを呼ぶ 5:A1に1をプラス 6:変数Nに1を入れる 7:関数aを呼ぶ という形で無限ループしてます。 aという関数の中で、必ず再帰していて抜けることがないプログラムなので 終了しません。 どういうことをしたいのか分かりませんが、 例えば、Range("a1")に0が入っていたとして、 Range("a1") = Range("a1") + 1 の下の行に If Range("a1")=2 then Exit Sub End If が入っていたとすると 1:関数aを実行 2:A1に1をプラス 3:A1が2ではないので、続く 3:変数Nに1を入れる 4:関数aを呼ぶ 5:A1に1をプラス 6:A1が2なので、関数aの終了 ←ここからが再帰のポイント 7:変数Nに1をプラスして2にする 7:変数Nは5になっていないので、続く 8:関数aを呼ぶ ・・・・・という感じで続いて書いていくと長くなるので後略しますが、 ちゃんと終了するはずです。 要するに、 関数a(関数a1とする)の中で関数a(関数a2とする)を呼んだ場合、関数a2が 終わるまで、関数a1の”関数a2を呼んだ行”の次の行は実行されません。 こんな説明でOKでしょうか? |
▼yu-ji さん: ありがとうございます。 説明はたいへんよく分かりました。 しかしながら、以下を追加しても無限ループから抜けることが出来ません。 再度、ご教授ください。お願いします。 >If Range("a1")=2 then > Exit Sub >End If |
▼カド さん: >▼yu-ji さん: >ありがとうございます。 >説明はたいへんよく分かりました。 > >しかしながら、以下を追加しても無限ループから抜けることが出来ません。 >再度、ご教授ください。お願いします。 > > >>If Range("a1")=2 then >> Exit Sub >>End If すみません(^^; 下記のようにFor文の前を修正してみてください。 今度こそ、終了します(苦笑)。 If Range("a1") < 2 Then Range("a1") = Range("a1") + 1 Else Exit Sub End If Range("a1")が2を越えちゃったので、無限ループしてました(^^; |
▼yu-ji さん: >Range("a1")が2を越えちゃったので、無限ループしてました(^^; たしかに今度は終了しました。 でも、yu-jiさんが最初に教えてくれた記述でも、 Range("a1")が2を越えるまえに、Range("a1")=2の時点でループから 抜けれると思うのですが? なにか勘違いをしているでしょうか? |
こんにちは〜 yu-ji さん、横から失礼します。 >たしかに今度は終了しました。 >でも、yu-jiさんが最初に教えてくれた記述でも、 >Range("a1")が2を越えるまえに、Range("a1")=2の時点でループから >抜けれると思うのですが? 抜けられないです。 Sub a() のところにブレークポイントをおいてステップ実行しながら、 A1の値を追っていくとよくわかると思いますが。 For n = 1 To 5 a Next n このなかで、一度目にaが呼ばれたとき、A1の値が2になって、 確かにそのときはプロシージャaが終了するのですけど、 2度目に呼ばれた時に、(nが2のとき)A1の値が3になってしまうので、 そのまま、無限ループに突入します。 なので、「=」で判定するのではなくて「>」で判定しないとダメです。 ですよね? yu-jiさん。 |
▼つん さん: 大変よくわかりました。 この辺のミスでよく時間を浪費してしまいます。 ありがとうございました。ニコ(^^) |
▼つん さん: >なので、「=」で判定するのではなくて「>」で判定しないとダメです。 > >ですよね? yu-jiさん。 そうですね(^^; フォローありがとうございました。 プログラム変えるのは、”=”を”>”に変えるだけで良かったんですよねぇ。 間違ったことに慌ててまいました(^^; |