• ベストアンサー

指定したセルの数値以下になるまで減算を繰り返す方法

お世話になります。VBAの質問です。 仮に、A1=D1÷x、B1=500、C1=A1+B1、D1=2,000のような状況で(雑で申し訳ない)、D1の値を下げ続けることでC1=D1に到達できるものと仮定した場合、C1=D1に到達するまでD1-5を繰り返し、到達した時点の値をF1に表示する、ということは可能でしょうか。 Untilかなとは思うのですが、ループが抜けられず… 頭からお尻までご教示いただけると助かります。

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

  • ベストアンサー
  • kon555
  • ベストアンサー率51% (1844/3562)
回答No.1

「A1=D1÷x」という条件の意図が分からないので、純粋にコードの話だけ。  また「到達した時点の値をF1に表示する」の値、というのはループ回数の事でいいですよね? 「C1=D1に到達する」という前提である以上、計算値を出力する事は無意味ですから。  基本的なループ処理で可能です。For nextでも可能ではありますが、まあDo Loopがスマートですね。  下記のコードで可能です。 Sub ループ() Dim C, D, i C = Range("C1").Value D = Range("D1").Value i = 0 Do Until D <= C D = D - 5 i = i + 1 Loop Range("F1").Value = i End Sub  頭からお尻までという事なので一応解説を。  まず変数にセルの値を格納します。これはセルを都度変更するより処理が高速だからです。  Do Untilは条件が満たされるまでループを繰り返しますので、条件として『D <= C』とします。  注意点として、この時『D = C』としてはいけません。元々が「A1=D1÷x、B1=500、C1=A1+B1、D1=2,000」という条件なので、xがC1とD1の差が5の倍数にならないような値の場合、いつまでも条件を満たさないため無限ループしてしまいます。  そのため『D <= C』とする事で、DがCを下回ったら抜けるようにしています。本当はC1とD1の差が5の倍数であるかを事前に確認しておくべきですが、とりあえずシンプルにいきました。  あとは『D = D - 5』で計算を繰り返し、『i = i + 1』でループ回数をカウント、抜けたらF1セルにループ回数を出力します。  ちなみにWhileでも処理できます。そもそも"条件を満たす限り繰り返す" か "条件を満たすまで繰り返す" かの違いなので、単にCとDの以上以下を引っくり返すだけの話です。

utayomi11
質問者

お礼

ありがとうございました。xもまた変数で状況次第なのですが、C1=D1となるところが目標値で、そのためにはD1をいくつまで下げればいいのかを5単位で検証したかったのです。説明が下手で申し訳ないです。参考にさせていただきます。

Powered by GRATICA

関連するQ&A