Page 68 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼407のカドさんの質問に関連して ちょび 02/9/11(水) 21:29 ┣Re:407のカドさんの質問に関連して つん 02/9/12(木) 10:23 ┃ ┣ものすごい勘違い(赤面) ちょび 02/9/12(木) 11:26 ┃ ┃ ┗再帰じゃなくても(笑) yu-ji 02/9/12(木) 11:48 ┃ ┗Re:407のカドさんの質問に関連して yu-ji 02/9/12(木) 11:29 ┃ ┣Re:407のカドさんの質問に関連して カド 02/9/12(木) 12:34 ┃ ┃ ┗駄レスです。 yu-ji 02/9/12(木) 13:17 ┃ ┗勉強しました〜 つん 02/9/12(木) 12:41 ┗皆さんありがとうございます&すみません ちょび 02/9/12(木) 13:01 ┣Re:皆さんありがとうございます&すみません カド 02/9/12(木) 13:11 ┗余談ですが。 yu-ji 02/9/12(木) 13:13 ─────────────────────────────────────── ■題名 : 407のカドさんの質問に関連して ■名前 : ちょび ■日付 : 02/9/11(水) 21:29 -------------------------------------------------------------------------
407のカドさんのスレッドの下に一度入れたのですが、 もしも誰も気づいてくれなかったら悲しいなと思ってしまい、 改めて別スレッドで質問させていただきます。 (ずうずうしくてごめんなさい) カドさんの質問、ちょうど私も悩んでいた問題だったので 興味深く読ませていただいてました。 それで、みなさんの書かれたコードを使わせていただいて(勝手にごめんなさい) 自分が作りたいものに似せて以下のように書いてみました。 Sub a() Range("B2") = Range("B2") + 0.001 If Range("i2") < Range("a2") Then Range("B2") = Range("B2") + 0.001 Else Exit Sub End If For n = 0.001 To 0.5 a Next n End Sub 書き方が間違っていたら教えてください。 i2には計算式が入っています。仮に=B2*0.6/2とします。 質問が3点ほどあるのですが・・・・ 最初の質問は、上の場合だとi2の値がa2の値を超えた直後に計算が終わります。 これを、i2の値がa2の値を超える直前に止まるようにはできないでしょうか? もうひとつはFor以下でTo 0.5と入れてますが、この0.5を別に入力するD2の値までに したいのですが、どのように書けばいいんでしょうか? For n = 0.001 To Range("D2") と書いたら ぐるぐる回りつづけて止まらなくなりました。(T_T) 最後の質問はこの文の中に最初は必ず0.001からスタートするようにしたいのですが どこにどう書けばいいんでしょうか? 実行の最初でB2を空にした後に0.001を入れて計算し始めるようしたいのです。 すごくバカみたいな質問だと思う(しかもたくさん)のですが どうかよろしくお願いします。 |
ちょび さん、おはようございます。 ちょっといろいろ考えてみました。 こんな感じでしてみたら、ちょびさんのご要望にはお応えできてると思いますが、いかがでしょうか? '============================================== Sub test() Range("b2").Value = 0 Call a End Sub Sub a() Dim n As Double Range("B2") = Range("B2") + 0.001 If Range("i2") < Range("a2") Then ’a2に0.5を入れて試しました Range("B2") = Range("B2") + 0.001 Else '↓ここで、b2の値をひとつ戻せば、 ’「i2の値がa2の値を超える直前に止まるよう」に出来るみたいです。 Range("b2") = Range("b2") - 0.001 Exit Sub End If For n = 0.001 To Range("D2").Value Call a Next n End Sub '============================================== >もうひとつはFor以下でTo 0.5と入れてますが、この0.5を別に入力するD2の値までに >したいのですが、どのように書けばいいんでしょうか? >For n = 0.001 To Range("D2") と書いたら >ぐるぐる回りつづけて止まらなくなりました。(T_T) For n = 0.001 To Range("D2").Value これでOKでしたよ? >最後の質問はこの文の中に最初は必ず0.001からスタートするようにしたいのですが >どこにどう書けばいいんでしょうか? >実行の最初でB2を空にした後に0.001を入れて計算し始めるようしたいのです。 a()内では処理できないと思うので(そうすると毎回初期化されてまうし) 別のプロシージャから呼び出して、そのプロシージャのはじめに初期化処理をすればOKです。 あと、 '============================================== Sub a() Range("B2") = Range("B2") + 0.001 If Range("i2") < Range("a2") Then Range("B2") = Range("B2") + 0.001 Call a ’ここでaをコール Else Range("b2") = Range("b2") - 0.001 Exit Sub End If End Sub '============================================== この形でもおなじ結果がでました。 私も手探り状態でいろいろ試した結果での回答なんですが、 よかったら試してみてくださいませ。 さて、ここでちょっと私自身質問させていただきたいのですが、 よろしいでしょうか(必殺!便乗質問!!) For n = 0.001 To Range("D2").Value Call a Next n この部分なんですけど、nをカウントアップしていくのに、0.001から0.5という数字で処理していますよね? 普通、カウントするのは、整数を使うんと違うかなあ〜? ということで、 n = 1 to 500 のように書き換えてやってみました。 そしたら、何故か、I2の値が0.5前後を繰り返して止まらなくなってしまいました。 それはなんででしょうか? n = 0.001 To Range("D2").Value とするのに、どういう意味があるのでしょう? ちょびさん、便乗質問してしまってすみません。 よろしくお願いします。 また、こういうときに種別で悩むよな〜「質問」にしちゃえ!! |
つんさん、ありがとうございます。 話が前後しますが、最初にお詫びです。 >さて、ここでちょっと私自身質問させていただきたいのですが、 >よろしいでしょうか(必殺!便乗質問!!) > > > For n = 0.001 To Range("D2").Value > Call a > Next n > >この部分なんですけど、nをカウントアップしていくのに、0.001から0.5という数字で処理していますよね? >普通、カウントするのは、整数を使うんと違うかなあ〜? 私、ものすごい勘違いをしてたんですねぇ。^^; Forのところには、セルB2に入れたい範囲を書くのだと思ってました。(おバカ) 夕べからいろいろ試して、たとえばn = 0.001 To 0.5って書いても B2が0.5以上になるのに止まらないので、どっかおかしいなーとは 気付いてたのですが、何をどう修正したらいいのかわからず 悩んでました。 改めて質問してよろしいでしょうか? 私がやりたいのは、B2に0.001から始めて0.002、0.003というように 0.001ずつ追加して計算をしていき、それを使ったI2の結果がA2に入力した 数字に最も近いところで止める、っていうことなんですね。 D2に入れる数字は、B2に入れるべき上限の数字なんです。 仮にD2に0.3をいれた場合、たとえ求めるI2(限りなくA2に近い数字)に なるためのB2が0.5だとしても、0.3で計算をストップして、「範囲を超えます」 のように何かメッセージを出すというものにしたいのです。 (説明がわかりにくくてすみません。) For n = *** To *** ここ***に入るのは、計算の回数なんですねー。(やっとわかった) となると、最初は1でいいと思うのですが、Toはわからないということに なってしまいます。 これって、必要ないんかな? というわけで、つんさんの2つめの方を以下のようにして試して見ました。 (これでいいんでしょうか?) '============================================== Sub test() Range("b2").Value = 0 Call a End Sub Sub a() Range("B2") = Range("B2") + 0.001 If Range("i2") < Range("a2") Then Range("B2") = Range("B2") + 0.001 Call a 'ここでaをコール Else Range("b2") = Range("b2") - 0.001 Exit Sub End If End Sub '============================================== ありがとうございます。これで、問題の2つは解決しました。 test()でB2に最初に0を入れて次にa()を呼び出す。 計算をしていって、I2がA2を超えたところで計算をストップしてB2を0.001だけ戻す。 さすがーーー!勉強になります。 でもって、最後の問題の・・・ D2の数字までっていうのは、別の書き方をしなければいけないってことに なるんですよ・・ね? なんか、ずうずうしいのを承知でお願いします。 何と書けばいいのか教えてください。m(_ _)m |
▼ちょび さん: >改めて質問してよろしいでしょうか? >私がやりたいのは、B2に0.001から始めて0.002、0.003というように >0.001ずつ追加して計算をしていき、それを使ったI2の結果がA2に入力した >数字に最も近いところで止める、っていうことなんですね。 > >D2に入れる数字は、B2に入れるべき上限の数字なんです。 >仮にD2に0.3をいれた場合、たとえ求めるI2(限りなくA2に近い数字)に >なるためのB2が0.5だとしても、0.3で計算をストップして、「範囲を超えます」 >のように何かメッセージを出すというものにしたいのです。 >(説明がわかりにくくてすみません。) 再帰の必要はないですね(^^; Sub test() Range("b2") = 0.001 '初期値をセット Do Until Range("a2") < Range("i2") If Range("b2") > Range("d2") Then '上限値との比較 MsgBox "オーバー" Exit Sub End If Range("b2") = Range("b2") + 0.001 Loop Range("b2") = Range("b2") - 0.001 End Sub こんなプログラムでいけると思います。 |
こんにちは。 ▼つん さん: >'============================================== >Sub test() > Range("b2").Value = 0 > Call a >End Sub > >Sub a() > Dim n As Double > > Range("B2") = Range("B2") + 0.001 > If Range("i2") < Range("a2") Then ’a2に0.5を入れて試しました > Range("B2") = Range("B2") + 0.001 > Else > '↓ここで、b2の値をひとつ戻せば、 > ’「i2の値がa2の値を超える直前に止まるよう」に出来るみたいです。 > Range("b2") = Range("b2") - 0.001 > Exit Sub > End If > > For n = 0.001 To Range("D2").Value > Call a > Next n > >End Sub >'============================================== >>もうひとつはFor以下でTo 0.5と入れてますが、この0.5を別に入力するD2の値までに >>したいのですが、どのように書けばいいんでしょうか? >>For n = 0.001 To Range("D2") と書いたら >>ぐるぐる回りつづけて止まらなくなりました。(T_T) > >For n = 0.001 To Range("D2").Value >これでOKでしたよ? えと、念のために。 .Valueは付けなくても同じ結果になるので、 止まらなくなった理由は別にあると思います。 d2に変な値が入っていたとか>ちょびさん >>最後の質問はこの文の中に最初は必ず0.001からスタートするようにしたいのですが >>どこにどう書けばいいんでしょうか? >>実行の最初でB2を空にした後に0.001を入れて計算し始めるようしたいのです。 これって、Range("i2") < Range("a2") の間は+0.002されると思うのですが、 これでいいのでしょうか? それでいいなら、問題ないですが。+0.001ずつ増やしたいんかなと思った ので。>ちょびさん >ここで、b2の値をひとつ戻せば、 >「i2の値がa2の値を超える直前に止まるよう」に出来るみたいです。 あと、気になったのですが、 『For n = 0.001 To Range("D2").Value』の文はStepの指定がないです。 省略されると、nは+1されて1.001となりますが、それでOKなんですか? Step 0.001とかが必要なんじゃないかなと。 >この形でもおなじ結果がでました。 そもそも、カドさんのレスに書いた自分の例があんまり上手くなかったんですよね(^^; 分かってはいたんですが、まぁ、要は止まればええんかな?って書いてしました(^^; >さて、ここでちょっと私自身質問させていただきたいのですが、 >よろしいでしょうか(必殺!便乗質問!!) > For n = 0.001 To Range("D2").Value > Call a > Next n > >この部分なんですけど、nをカウントアップしていくのに、0.001から0.5という数字で処理していますよね? >普通、カウントするのは、整数を使うんと違うかなあ〜? >ということで、 n = 1 to 500 のように書き換えてやってみました。 >そしたら、何故か、I2の値が0.5前後を繰り返して止まらなくなってしまいました。 >それはなんででしょうか? 止まらないんじゃなくて、凄い処理に長い時間がかかっているだけだと思います。 理由は、上記に書いたStepのせいですね。 0.001→1.001なので、実質500回もループをしていないせいだと思います。 ****************** ちなみにですが。 >>ぐるぐる回りつづけて止まらなくなりました。(T_T) が気になったのですが、CTRL+BREAKで強制的にデバッグモードで中断 できるのはご存知ですか? (T_T)なので、ひょっとしたらExcelを強制終了させたりしてるのかと 思ったので。 ご存知でしたら、すみません(^^; |
▼yu-ji さん:こんにちは >そもそも、カドさんのレスに書いた自分の例があんまり上手くなかったんですよね(^^; >分かってはいたんですが、まぁ、要は止まればええんかな?って書いてしました(^^; 私の質問から派生していろいろ議論されているようですが、 私の質問の主旨は、あくまでも 1.”再帰”が知りたかった。 2.以下のループから抜け抜けることができない理由が知りたかった。 For n = 1 To 5 a Next n ということなので、yu-jiさんの回答が100点満点であって、同じ結果が得られる別の方法が知りたかったわけではありません。 ですから、再度有難うございました。 |
▼カド さん: >ということなので、yu-jiさんの回答が100点満点であって、同じ結果が得ら >れる別の方法が知りたかったわけではありません。 プログラムミスで、結局つんさんにフォローしていただいたので、 全然100点ではないです、はい(^^; わざわざ、どうも。(^^ |
yu-ji さん、こんにちは〜 ちょびさんの質問は、yu-jiさんの回答で解決しそうですね。 私もちょびさんの2度目の書き込みは読んだのですが、 なんだか混乱気味でした(^^; yu-jiさんの回答みて、納得した・・・ >これって、Range("i2") < Range("a2") の間は+0.002されると思うのですが、 >これでいいのでしょうか? >それでいいなら、問題ないですが。+0.001ずつ増やしたいんかなと思った >ので。>ちょびさん 私も、気になって、+0.001ずつに書き換えてみたんですが、 そしたら、コール回数がめちゃ多くなって「スタック領域が不足」してしまいました(>_<) ので、まあいいやって、+0.002でしてました。 >あと、気になったのですが、 >『For n = 0.001 To Range("D2").Value』の文はStepの指定がないです。 >省略されると、nは+1されて1.001となりますが、それでOKなんですか? >Step 0.001とかが必要なんじゃないかなと。 あ゙っ・・・そうか! 私は、初期値が0.001なら、0.001ずつカウントされるんだと思いこんでました。 (なにせ整数でしかしたことがない) ステップ実行でnの値を追っても、最新に呼び出されたnの値しかわからないし。 >>ということで、 n = 1 to 500 のように書き換えてやってみました。 >>そしたら、何故か、I2の値が0.5前後を繰り返して止まらなくなってしまいました。 >>それはなんででしょうか? >止まらないんじゃなくて、凄い処理に長い時間がかかっているだけだと思います。 >理由は、上記に書いたStepのせいですね。 >0.001→1.001なので、実質500回もループをしていないせいだと思います。 わかりました。無意味なループを何度も繰り返してるだけだったみたい。 あそこで、aをコールするにしても、1度コールすればすむことだったみたい。 For n = 0.001 To Range("D2").Value で、D2に0.5をいれてたら、 実際は、1度しか通ってないですもんね。 2回目はすぐ、1.001だから、いきなり0.5を越えてしまってますもん。 Setep 0.001を入れたら、n = 1 to 500 と同じ結果になりました。 いろいろ勉強になりました。どうもありがとうございました。 ちょびさん、ちょびさんの質問で私もいろいろ勉強させてもらいました。 ありがとうございました。 |
yu-jiさん、つんさん、ありがとうございます。 みなさん、こんにちは。 ▼yu-ji さん: >再帰の必要はないですね(^^; > >Sub test() > > Range("b2") = 0.001 '初期値をセット > Do Until Range("a2") < Range("i2") > If Range("b2") > Range("d2") Then '上限値との比較 > MsgBox "オーバー" > Exit Sub > End If > Range("b2") = Range("b2") + 0.001 > Loop > Range("b2") = Range("b2") - 0.001 > >End Sub > >こんなプログラムでいけると思います。 ありがとうございます。 これで、ちゃんとできるようになりました。\(^o^)/ 何故、うまく行くのかがイマイチわからないところが情けないのですが・・(^^ゞ もうちょっと勉強して見ます。 >ちなみにですが。 > >>ぐるぐる回りつづけて止まらなくなりました。(T_T) > >が気になったのですが、CTRL+BREAKで強制的にデバッグモードで中断 >できるのはご存知ですか? >(T_T)なので、ひょっとしたらExcelを強制終了させたりしてるのかと >思ったので。 >ご存知でしたら、すみません(^^; えへへ。知りませんでした。 ぐるぐる回った時、ESCを押したら止まったので、これでいいのかなと 思ってました。 ありがとうございます。これも、勉強になりました。 ▼つんさん: >ちょびさん、ちょびさんの質問で私もいろいろ勉強させてもらいました。 >ありがとうございました。 涙が出るほど嬉しいですぅ。 皆さんを混乱させてばっかりなのに・・・ごめんなさい。 ------------------------ カドさんの質問に便乗して、わけのわかんない質問をしてしまった おかげで、皆さんにご迷惑をおかけしちゃってるようで、大変申し訳ありません。 実際、よくわかってないもんで曖昧なまま、投げ出すような質問のし方で ごめんなさい。 今回のところをもう一度しっかり復習して勉強しなおしてみます。 カドさんにも、よけいな気を使わせてしまいました。すみません。 でも、皆さんが本当に親切に答えて下さるので本当に嬉しいです。 助かってます。 今後もよろしくお願いします。m(_ _)m (うわ!また"ちょび"かよー!って思われるかもしれませんが) |
▼ちょび さん:こんにちわ〜 なにわともあれ、うまくいってよかったですね。 実は私も初心者でこのような質問箱に投稿するのは初めてなんです。 みんながあまりにも早く親切に回答をくれるのでビックリしています。 ちょびさんの質問になかなかレスがなく心配してました。 微力ながら私が回答(質問?)しようとしてたら、みんなの回答があってほっとしました。 今後ともよろしく! |
▼ちょび さん: >>ちなみにですが。 >> >>>ぐるぐる回りつづけて止まらなくなりました。(T_T) >> >>が気になったのですが、CTRL+BREAKで強制的にデバッグモードで中断 >>できるのはご存知ですか? >>(T_T)なので、ひょっとしたらExcelを強制終了させたりしてるのかと >>思ったので。 >>ご存知でしたら、すみません(^^; > >えへへ。知りませんでした。 >ぐるぐる回った時、ESCを押したら止まったので、これでいいのかなと >思ってました。 > >ありがとうございます。これも、勉強になりました。 CTRL+BREAKとESCは同じ機能ですね(笑)。 ESCでもOKだと知りませんでした。 勉強になりました(^^ |