6.3. 条件を満たす(満たされない)間は繰り返す(Do Loop ステートメント)
6.3.1. 始める前の注意点
今回作成するマクロは暴走すること(無限ループに陥ること)がたまにある.マクロを正確に 書くことはもちろん大切であるが,こまめにセーブすることで被害を最小限に留めることも心が けてほしい.
6.3.2. 概要
For Next ステートメントは一般に与えられた回数分繰り返すという形で使うことが多い.一方,
繰り返しの回数が確定せず条件を満たすまで繰り返す場合にはほかの方法を用いる.以下に,そ の構文とプログラム例をすべて記す.
注意しなくてはならないのは以下の3点である.
始まりと終わり
Do: 繰り返しの始まりを示す.
Loop: 繰り返しの終わりを示す.
条件の意味
While: 条件式が成立している間は繰り返すことを示す.
Until: 条件式が成立するまで繰り返すことを示す.
条件の評価時期
Do のあとに条件を記す場合:条件を判断してから繰り返す.
Loop のあとに条件を記す場合:繰り返しを行ったあとで条件を判断する.
6.3.3. 例題について
以下では「複利計算をして最初の資産が何年後に目標金額に なるのかを求める」プログラムを作成する.図に示したように,
ワークシートの B1 セルに元金, B2 セルに目標金額,そし て B3 セルに年利率が入っているとする.このとき,目標金 額を超える年数を B4 セルに代入するプログラムを作成する ことにする.(実を言えば,繰り返しを用いなくても書くこと ができる)
6.3.4. Do Until ~ Loop ステートメント
条件式が成立するまで繰り返す.繰り返している間は条件式は成立していない.条件式は最初 に判断される.
Do Until 条件式
繰り返したい処理(複数行も可)
Loop
Sub DUL()
'Do Until ループの例
Dim mokuhyou As Integer, rishi As Integer Dim genzai As Integer, nensuu As Integer Dim riritsu As Double
nensuu = 0
genzai = Range("B1").Value mokuhyou = Range("B2").Value riritsu = Range("B3").Value
Do Until genzai >= mokuhyou '現在値が目標以上になるまで rishi = riritsu * genzai
genzai = genzai + rishi nensuu = nensuu + 1 Loop
Range("B4").Value = nensuu Range("B5").Value = genzai End Sub
6.3.5. Do ~ Loop Untilステートメント
条件式が成立するまで繰り返す.繰り返している間は条件式は成立していない.条件式は最後 に判断される.
Do
繰り返したい処理(複数行も可)
Loop Until 条件式
Sub DLU()
'Do Loop Until の例
Dim mokuhyou As Integer, rishi As Integer Dim genzai As Integer, nensuu As Integer Dim riritsu As Double
nensuu = 0
genzai = Range("B1").Value mokuhyou = Range("B2").Value riritsu = Range("B3").Value
Do
rishi = riritsu * genzai genzai = genzai + rishi nensuu = nensuu + 1
Loop Until genzai >= mokuhyou '現在値が目標以上になるまで Range("B4").Value = nensuu
Range("B5").Value = genzai End Sub
6.3.6. Do While ~ Loop ステートメント
条件式が成立している間は繰り返す.繰り返している間は条件式が成立している.条件式は最 初に判断される.
Do While条件式
繰り返したい処理(複数行も可)
Loop
Sub DWL()
'Do While Loop の例
Dim mokuhyou As Integer, rishi As Integer Dim genzai As Integer, nensuu As Integer Dim riritsu As Double
nensuu = 0
genzai = Range("B1").Value mokuhyou = Range("B2").Value riritsu = Range("B3").Value
Do While genzai < mokuhyou '現在値が目標未満の間は rishi = riritsu * genzai
genzai = genzai + rishi nensuu = nensuu + 1 Loop
Range("B4").Value = nensuu Range("B5").Value = genzai End Sub
6.3.7. Do ~ Loop While ステートメント
条件式が成立している間は繰り返す.繰り返している間は条件式が成立している.条件式は最 後に判断される.
Do
繰り返したい処理(複数行も可)
Loop While条件式
Sub DLW()
'Do Loop While の例
Dim mokuhyou As Integer, rishi As Integer Dim genzai As Integer, nensuu As Integer Dim riritsu As Double
nensuu = 0
genzai = Range("B1").Value mokuhyou = Range("B2").Value riritsu = Range("B3").Value
Do
rishi = riritsu * genzai genzai = genzai + rishi nensuu = nensuu + 1
Loop While genzai < mokuhyou '現在値が目標未満の間は Range("B4").Value = nensuu
Range("B5").Value = genzai End Sub
6.3.8. この節のまとめ
条件を満たすまで(もしくは条件を満たしている間ずっと)繰り返すというタイプの計算(言 い換えれば,繰り返しの回数が条件によって決まる計算)が必要なケースはとても多い.そのた めに,この節の内容は重要になる.
While と Unitil は一方さえきちんと使えれば他方はその否定なので使わない機能である.例
えば, “While A” を Until を使って書くなら, “Until Not(A)” となる.なぜふたつの機能が用
意されたのかはわからないが,While (~の間ずっと)と Unitl (~するまでずっと)と,英語 の意味がそのまま言語として使えるのでわかりやすさはあるかもしれない.
6.3.9. 練習問題
次のプロシージャを作りなさい.
ワークシートの D 列にたくさん数値が入っているとき.D1 から列方向にむけて検索を行い,
値が 12 である最初のセルを見つける.
初項2公比1.2の等比数列のうち 20 以下の数をE1 セルから列方向に代入する.
一つ目の練習問題に数字がなくなったら中止する機能を追加したもの.
「はい」を押すまで説得し続けるマクロ(MsgBox の機能について調べてみること).
以下の式を用いて,円周率の近似値を計算する.
9 1 7 1 5 1 3 1 1 4 1 2
) 1 ( 4
1
1
i
i
i