Page 128 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼計算が途中で止まってしまうのです。 ちょび 02/9/20(金) 16:19 ┗Re:計算が途中で止まってしまうのです。 yu-ji 02/9/20(金) 17:07 ┗Re:計算が途中で止まってしまうのです。 ちょび 02/9/20(金) 17:38 ┣Re:計算が途中で止まってしまうのです。 ひで 02/9/21(土) 11:24 ┃ ┗Re:計算が途中で止まってしまうのです。 ちょび 02/9/22(日) 9:41 ┗Re:計算が途中で止まってしまうのです。 yu-ji 02/9/24(火) 10:51 ┣Re:計算が途中で止まってしまうのです。 ひで 02/9/24(火) 15:33 ┗大変申し訳ありません。 ちょび 02/9/25(水) 10:00 ┗念のため。 yu-ji 02/9/25(水) 10:55 ┗Re:念のため。 ちょび 02/9/25(水) 11:07 ─────────────────────────────────────── ■題名 : 計算が途中で止まってしまうのです。 ■名前 : ちょび ■日付 : 02/9/20(金) 16:19 -------------------------------------------------------------------------
こんにちは。ちょびです。 またお世話になります。 つんさん、yu-jiさん、こんにちは。この投稿見てくれると嬉しいんですが・・・ 9/11に423のスレッドで質問した件についての続き?なんです。 実は、あれからyu-jiさんに教えていただいた、コードをちょっと応用させて 作成しました。 それを同じようなフォーム(計6個)にコピーしたんです。 ところが、なぜか1個だけ計算が条件を満たしていないのに 止まってしまう時があるんです。 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 上の中で計算結果のi2が、別に入力している値a2に満たないのに b2=d2の値でメッセージボックスを出さずに、正常の終わり方と 同じように止まってしまうのです。 うまく行く場合にはi2がa2より小さいうちはずっとb2に0.001ずつ値を 足していってb2がd2+0.001と同じになった時にメッセージボックスを 出します。 こんなことってあるんでしょうか? ちなみに、現象はa2に入れる値の違いによるように思われます。 また、コピーしたフォームはコードがほとんど変わらずセルの名前の 違いがあるだけです。 i2に入っている計算式はそれぞれ違います。(結構複雑かも?) とても、曖昧な質問のし方だと思いますが、参っています。(T_T) 助けていただけないでしょうか? よろしくお願いします。 |
こんにちは。 ▼ちょび さん: >ところが、なぜか1個だけ計算が条件を満たしていないのに >止まってしまう時があるんです。 >上の中で計算結果のi2が、別に入力している値a2に満たないのに >b2=d2の値でメッセージボックスを出さずに、正常の終わり方と >同じように止まってしまうのです。 上手く行かないときというのは、b2=d2の時ですか? b2 > d2 の時にしか”エラー”を出さないですが、=の時も出す 必要があり? >ちなみに、現象はa2に入れる値の違いによるように思われます。 >i2に入っている計算式はそれぞれ違います。(結構複雑かも?) いまいち状況が分からないのですが、計算式やその他の値を ここに書くことはできないですか? そうすればこちらで試してみて、何か分かるかもしれませんが、、、、 #仕事の話だと難しいかな。 あと、ひょっとしてですが、純粋に、小数点の問題も考えられます。 セルの値でじかに判断してるので、問題ないかなと思ってたんですが、 ひょっとしたら小数点以下の誤差が影響しているかもしれないです。 それが原因なら、 1案:*1000するなどして、整数で計算させる。 2案: i2に入れている計算式をコードで記述する&セルに入れてる変数(通貨型) に入れて計算し、最終的に計算結果をi2に入れるというようにする。 ・・・・・というようにしたら解決するかもしれないです。 いずれにしろ、これだけの情報では、いまいちよく分かりません(^^; |
▼yu-ji さん: )^o^( 早速のレスありがとうございます。 >上手く行かないときというのは、b2=d2の時ですか? >b2 > d2 の時にしか”エラー”を出さないですが、=の時も出す >必要があり? =の時は必要無いんです。 もう一度説明して見ます。(うまく説明できるかな?) ちなみにi2に入ってる計算式はそれより前に数ヵ所の計算をして 最後に行われる場所なので、ここに載せるのは難しいです。 (私の能力不足です。) 話を戻して・・・ うまく行かない状況っていうのが、仮にa2に0.5と入れたとします。 d2には0.3が入ってるとします。 しつこいようですが・・・ b2に0から0.001ずつプラスして入っていきますよね。 計算結果(i2)がa2の0.5を超えた時にb2の値を0.001だけ戻して i2が0.5未満の数字になるところのb2を求め、計算を終了させて指定のシートを 表示させるようにしています。 「ただし」の条件として計算結果(i2)が求める値にたどり着く前にb2の値が0.3を超えてしまった場合(=0.301)にエラーのメッセージを出したいというのがこのコードの目指すものなんですが。 失敗の状況って言うのは、b2に0.3が入ったところで計算が終了し、エラーのメッセージ ボックスを出さず(つまり、次の0.301をb2に入れずに)計算を終了して、あたかも 求めるb2が0.3であったかのように終了するんです。 a2に0.5を入れると、失敗(=止まる)でa2に0.9を入れると成功(=メッセージが出る) というような状況です。 他のフォームは今のところ、同じような現象が起きないのでi2の計算式とa2に入れる値の 関係に原因がありそうに思えるのですが・・・ (それなのにi2の計算式が表現できないとは・・・情けない) 理解してもらえたでしょうか?(^^ゞ >あと、ひょっとしてですが、純粋に、小数点の問題も考えられます。 >セルの値でじかに判断してるので、問題ないかなと思ってたんですが、 >ひょっとしたら小数点以下の誤差が影響しているかもしれないです。 > >それが原因なら、 > >1案:*1000するなどして、整数で計算させる。 > >2案: >i2に入れている計算式をコードで記述する&セルに入れてる変数(通貨型) >に入れて計算し、最終的に計算結果をi2に入れるというようにする。 これについてはちょっと試す時間をいただけますか? やって見ます。 |
▼ちょび さん yu-ji さん こんにちは 横からとびこみ失礼します。 私なりに、考えてみたのですが i2にどのような計算式が入っているかわかりませんので 憶測になりますが、i2の計算式にb2をとりこんでいるという 前提で、スタート時に a2=0.5 b2=0.001 d2=0.3 i2=0.201 i2の計算式は単純に i2=b2+0.2 で 試したところ >失敗の状況って言うのは、b2に0.3が入ったところで計算が終了し、エラーのメッセージ >ボックスを出さず(つまり、次の0.301をb2に入れずに)計算を終了して、あたかも >求めるb2が0.3であったかのように終了するんです。 ↑このようになりました。実際には b2=0.301 i2=0.501 になり この行で判定され Do Until Range("a2") < Range("i2") ・ ・ ・ Range("b2") = Range("b2") - 0.001 ここまでとんで b2=0.3 になりました。 ちょびさんが望んでいることはたぶん下ような ことではないかと思うのですが、いかがでしょうか? yu-jiさんのコードをそのままお借りして Sub test() Range("b2") = 0.001 '初期値をセット Do Until Range("a2") < Range("i2")-0.001 ’(1) If Range("b2") > Range("d2") Then '上限値との比較 MsgBox "オーバー" Exit Sub End If Range("b2") = Range("b2") + 0.001 Loop Range("b2") = Range("b2") - 0.002 ’(2) End Sub (1)は b1 の初期値ぶんをひいて判定してます。 (2)は もともと-0.001だったのでさらに-0.001 を引きました。 まとはずれなら、ごめんなさい。 |
▼yu-ji さん、 ひで さん、おはようございます。 お二人とも、貴重なアドバイスを本当にありがとうございます。 質問しておいて、大変失礼なことと充分わかっておりますが どうしても、試してみる時間がとれずに困っています。 なんとか早めに、結果報告したいと思っておりますので もう少々時間を下さい。 ほんとうに、ごめんなさい。m(_ _)m |
ひでさんが書かれたプログラムで、上手くいくと思いますが。 #目標値を-0.001して、求めた値を-0.002してというのが #理解しづらいかなと思ったので、一応おわび&別解を載せます。 >理解してもらえたでしょうか?(^^ゞ 理解できませんでした(笑)。<理解力ないらしい。 が、ひでさんの書き込みを見て、実際にプログラムを走らせて、 理解できました(^^; フォロー、ありがとうございました>ひでさん >>上手く行かないときというのは、b2=d2の時ですか? >>b2 > d2 の時にしか”エラー”を出さないですが、=の時も出す >>必要があり? > >=の時は必要無いんです。 『=の時に必要?』という書き方が悪かったみたいです。 ようは、b2=d2になったときに、次のb2(オーバーした値)を計算 する必要はなくて、”オーバー”を出したいということですよね? そもそも、上限値を越えているのに目標値とのチェックをするという記述をした 為に、思うように動かなかったようです。 すみませんでした(^^; >失敗の状況って言うのは、b2に0.3が入ったところで計算が終了し、エラーのメッセージ >ボックスを出さず(つまり、次の0.301をb2に入れずに)計算を終了して、あたかも >求めるb2が0.3であったかのように終了するんです。 ではなくて、実際のプログラムは、次の0.301をb2に入れており、それで計算 した結果がRange("a2") < Range("i2")になった為、求める答え(b2)が0.3だと 言ってます。 で何が問題だったかというと、Range("a2") < Range("i2")のチェックをした後に Range("b2") > Range("d2")のチェックをしている為です。 なので、 Range("b2") = 0.001 '初期値をセット Do Until Range("b2") > Range("d2") '上限値との比較 If Range("a2") < Range("i2") Then '目標値との比較 Range("b2") = Range("b2") - 0.001 '1個前データに修正 Exit Sub End If Range("b2") = Range("b2") + 0.001 Loop MsgBox "オーバー" とるすと、上手くいくと思います。 また前のプログラムのままで、 If Range("b2") >= Range("d2") Then '上限値との比較 としても、同じ結果になるはずです。 #意味的には、=を使うより上のプログラムの方が分かりやすいと思います。 >他のフォームは今のところ、同じような現象が起きないのでi2の計算式とa2に >入れる値の関係に原因がありそうに思えるのですが・・・ 他のフォームの計算式では、『b2=d2の時にRange("a2") < Range("i2")に ならず、更にb2+1した時にRange("a2") < Range("i2")になる』というデータで なかった為だと思います。 ですが、要は”たまたま”なので、上記プログラム(もしくは、ひでさんが書かれた プログラム)に修正しておく必要があります。 |
▼yu-ji さん こんにちは >ひでさんが書かれたプログラムで、上手くいくと思いますが。 >#目標値を-0.001して、求めた値を-0.002してというのが >#理解しづらいかなと思ったので、一応おわび&別解を載せます。 確かに理解しずらいですよね。自分でもこんがらがってました(笑) >>理解してもらえたでしょうか?(^^ゞ >理解できませんでした(笑)。<理解力ないらしい。 >が、ひでさんの書き込みを見て、実際にプログラムを走らせて、 >理解できました(^^; >フォロー、ありがとうございました>ひでさん いえいえ、自分でもこれでよいかどうか不安でしたが まとはずれでないようなので少しホッとしました。 いつものことですがここは勉強になります。 私、自身まだまだ勉強中ですので これからもご指導、宜しくお願いします。 |
yu-ji さん、ひでさん、おはようございます。 大変申し訳ありません。 先ほど、yu-jiさんの新しいコードを使って実験し、成功したので 一度レス載せたんですが、その後もう一度調べていて こちらの計算式のミスがあったことがわかりました。 i2を詳しく調べていて、抜けに気付いたんです。(情けない) いろいろと、考えていただいたのに本当に申し訳ありません。 ごめんなさい。 お詫びのしようがありません。 でもお二人に教えていただいたプログラムは大変勉強になりました。 これから、もう一度勉強しなおして行きたいと思います。 (なんか、言い訳っぽいですが、決してそうではありません。) ほんとうに、ほんとうにごめんなさい。 また、お世話になるかと思いますが、ご指導よろしくお願いいたします。 |
▼ちょび さん: >先ほど、yu-jiさんの新しいコードを使って実験し、成功したので >一度レス載せたんですが、その後もう一度調べていて >こちらの計算式のミスがあったことがわかりました。 >i2を詳しく調べていて、抜けに気付いたんです。(情けない) >ほんとうに、ほんとうにごめんなさい。 一応、念のためですが。 その後も、新しいコードの方を使ってますよね? 計算式のミスとプログラムのミスは、別問題なので、計算式にミスが あったからって、プログラムを元に戻してはいないですよね? 多分、そんなことはしていないと思いますが。 自分としては、たまたまそのミスのおかげで、プログラムのミスが分かったので、 逆に良かったです(笑) |
▼yu-ji さん: こんにちは。 >一応、念のためですが。 >その後も、新しいコードの方を使ってますよね? >計算式のミスとプログラムのミスは、別問題なので、計算式にミスが >あったからって、プログラムを元に戻してはいないですよね? >多分、そんなことはしていないと思いますが。 ご心配ありがとうございます。 大丈夫ですよ。現在すべてのフォームのコードを書きなおしているところです。 元々、必要無い計算式をIF関数(VBAでなく、EXCELの関数)でつけていたのが 今回の最大のミスでした。 これから、時間をかけてこのムダを処理していこうと思ってます。(^^ゞ >自分としては、たまたまそのミスのおかげで、プログラムのミスが分かったので、 >逆に良かったです(笑) そう言っていただけると、少し気持ちが楽になります。 今回は本当にご迷惑をおかけいたしました。 また、ぜひよろしくお願いいたします。m(_ _)m |