初心者のためのExcel エクセルマクロVBA入門-制御構文(Do Loop文)
ずっと繰り返すDo Loop
はーい。今日はDo Loop文です。For文じゃなくても結構使ったりすることもあります。とりあえず。まずは書き方からですね。実はこの構文は以外と条件をゆるーく設定できるので、書き方が色々あってちょっとややこしいかもしれません。
Do [While][Until] 条件式 処理 [Exit Do] Loop [While][Until]条件式
( ゚д゚)?なんなんコレ?
でしょうね!でしょうね!実は色々とどうやって説明しようか迷っていたのですが、やっぱり例を出すのがたぶん一番早いと思うので、それで行きたいと思います。Do LoopはFor文と同じで、やっぱりDoとLoopの間を繰り返します。そして、Forと違うのは繰り返す回数が決まってないこと。つまりもう永遠にずっと繰り返し続ける。ということです。
その為いわゆるずっとマクロが終わらない「無限ループ」の危険を常にはらんでいます。しかし、それを防ぐために、Exit DoやWhileやUntilと言った言葉があると思ってください。
Do While 条件 ~ Loop:条件を満たす間永久に・・・
サンプル
Do While a < 100 a = a + 1 Sheet.Cells(a, 1).Value = a Loop
これは変数aが100より小さい間はずっと繰り返します。ポイントは繰り返しを始める前にいきなり条件を指定しているところです。ですので例えばこれ以前の処理でaが100ならこの繰り返しは永遠に実行されることはありません。逆にひとたびループに入ると、aが100にならない限りは永久に繰り返し続けます。
Do Until 条件 ~ Loop:条件を満たすまで永久に・・・
サンプル
Do Until a = 100 a = a + 1 Sheet.Cells(a, 1).Value = a Loop
これは、変数aが100になったら、ループを抜けます。
( ゚д゚)?さっきとどう違うの?
例えば、さっきのWhileのコードをUntilに置き換えると、もしループに入る前にaが100より小さい場合、ループしません。Unitlは条件を満たしたらループを抜けるわけですからaが100より小さければループする前に条件を満たすこととなり、処理はスキップされます。しかし、a = 100となると、今度はaが100になるまではずっとループし続けます。
Do ~ Loop While 条件:条件を満たす間永久に・・・でも最低1回
サンプル
Do a = a + 1 Sheet.Cells(a, 1).Value = a Loop While a < 100
さて、これはどういうことかというとさっきのWhileがLoopの後についているだけです。この形だとループの中の処理を最低1回は実行する形になります。たとえaが100以上であっても。です。
プログラムは上から順に実行する。
この原則はどんな構文でも変わらないのです。したがって、条件式がLoopに書かれている場合、上から順に実行するとループの中の処理を必ず1回は通ることになります。そして最後にa < 100という条件を判定して、これを満たしていれば、処理を繰り返しますし、満たしてなければ繰り返しは終了します。
Do ~ Loop Until 条件:条件を満たすまで永久に・・・でも最低1回
サンプル
Do a = a + 1 Sheet.Cells(a, 1).Value = a Loop Until a = 100
これも先ほどと同じことが言えます。やはり処理を最低1回は行います。そして最後にLoop後のa = 100であれば、ループを終了し、そうでなければ繰り返します。
いかがでしょうか?この4つの違いがわかれば、ここではOKです。
でもぶっちゃけこれらは俺は使わない。
( ゚д゚)?はぁ?
散々説明しましたが、実は個人的にはこの条件式はあんまり使いません。だってIF文とExit Doで代用できるからです。明確に最低1回は実行したいとか何か理由がない限りはあんまりこの4パターンを使うことって私は少ないんですよね。乱暴ですけど。。
本来は、ちゃんと4パターンのどれかを使った方が良いと思いますので皆さんはそれを使っても良いですが、たとえばちょっと条件化しにくかったり条件が複雑だったりするとこんな手があります。
Do a = a + 1 Sheet.Cells(a, 1).Value = a If 複雑な条件 Then Exit Do End If Loop
上記のようにDo Loopの中にIf文を設けて、その中を満たせばExit DoでLoopを抜けます。このようにする場合にDoの後にもLoopの後にもWhileやUntilでの条件設定はいりません。
もちろん組み合わせてもOKです。ループを抜ける条件が複雑で、基本はWhileやUntilで設定し、例外的にLoopを抜けなければいけない処理が必要な場合にIfで判定してExit Doで抜けるということもできます。
これで2代制御構文である条件分岐と繰り返しの構文は終わりです。この回を含む4回で説明しましたが、いかがでしたでしょうか?わからない部分はコメントいただければと思います。
また、この制御構文までできれば、プログラミングの基礎はほぼ!マスターしたと言えます。
後は、実践あるのみです!
次回からは、もう少し実践的なテクニックを事例を交えながらやっていきたいと思います。
今日はここまで!
かしこ