今回の講座ではループ処理(Do~Loop文)について解説します。
前回の講座で解説したループ処理(For文)との違いや使い分け方についても解説します。
For文とDo~Loop文の使い方をマスターすれば、ほとんどのマクロを作る事が可能になります。
ループ処理をマスターすれば一気に視野が広がります。
頑張ってマスターしましょう!
Do~Loop文の使い方
Do~Loop文の基本的な使い方について解説します。
For文は繰り返す回数が決まっている時に使うのに対して、Do~Loop文は繰り返す回数が決まっていない時に使います。
Do~Loop文は「Do~While文」と「Do~Until文」の2種類があります。
Do~Loop文は基本的に次のように使います。
繰り返し処理
Loop
「Do~While文」と「Do~Until文」で使い方が変わってくるので、それぞれの使い方について解説します。
Do~While文の使い方
Do~While文は条件を満たす間処理を繰り返す時に使います。
たとえば、次のような成績表があったとします。
この成績表に対して、点数が80点以上の生徒の背景色を黄色に塗りつぶすマクロを作ってみましょう。
VBAでは次のように記載します。
このマクロを実行すると、先ほどの成績表は次のようになります。
80点以上の生徒名を背景色黄色で塗りつぶすことが出来ました。
それでは、VBAの中身いついて一つずつ見ていきましょう。
処理前準備
まずDo~While文の1行手前「i = 2」についてです。
生徒の成績表は2行目からスタートしますので、2行目から処理を開始するために、変数「i」に2を代入します。
Do~While文
続いて、Do~While 条件式についてです。
「Cells(i, 1).Value <> “”」は「i行目、1列目のセルの値が空白でない」という事を表わしています。
つまり、「Do While Cells(i, 1).Value <> “”」で「i行目、1列目のセルの値が空白でない間、処理を繰り返す」という意味合いになります。
※「Cells(i, 1)」は「Range(“A” & i)」と置き換えも可能です。詳しくは第3回講座(RangeとCellsの使い方)を参照ください。
繰り返し処理
最後に実際の繰り返し処理についてです。
「If Cells(i, 3).Value >= 80 Then」で「i行目、3列目の値が80以上だったら」というIf文です。
つまり「成績表の点数列が80以上だったら」という意味合いになります。
「Cells(i, 2).Interior.Color = RGB(255, 255, 0)」で「i行目、2列目の背景色を黄色にする」という処理になります。
※.Interior.Colorは背景色。RGB(255, 255, 0)は黄色。
これにより、「点数列が80以上の生徒名の背景色を黄色にする」という処理が完成します。
「i = i+1」で行を1つ進め、次の生徒に処理が移ります。
流れを1行ずつみてみよう
使い方が分かったところで、Do~While文について流れをつかんでみよう。
まず2行目の生徒を見てみましょう。
「i = 2」で2行目から処理がスタートします。
「Do While Cells(2, 1).Value <> “”」でA2セルは空白でないため、ループ処理の中に入っていきます。
点数は68点のため、80点以上ではないので、If文の中身には入りません。
「i = i +1」で行を1つ進めます。
行が1つ進んだため、3行目の生徒の処理に移ります。
「Do While Cells(2, 1).Value <> “”」でA2セルは空白でないため、ループ処理の中に入っていきます。
点数が98点のため、80点以上となり、If文の条件をクリアしています。
Cells(i, 2).Interior.Color = RGB(255, 255, 0)にて背景色を黄色に塗りつぶします。
「i = i +1」で行を1つ進めます。
これを繰り返すと8行目まで処理が進んだ時に、全ての生徒の処理が完了します。
8行目の処理が終わったとき、「i = i +1」で1行進みます。
9行目に移りますが、A9セルは空白のため、「Do While Cells(2, 1).Value <> “”」の「A列が空白でない間継続する」という条件から外れます。
そのため、9行目に移った段階で処理が終了します。
Do~Until文の使い方
Do~Until文は条件を満たすまで処理を繰り返す時に使います。
先ほどの成績表を例にDo~Until文を作ってみましょう。
同じように、点数が80点以上の生徒の背景色を黄色に塗りつぶすマクロを作ってみましょう。
VBAでは次のように記載します。
先ほどのDo~While文と似ているけど、違いが分かるかな?
Value <>(ノットイコール)が Value =(イコール)になっていますね。
その通り!Do~Untilは条件を満たすまで処理を繰り返すから、「i行目1列目のセルが空白になるまで」繰り返すという意味だよ。
Do~WhileとDo~Untilでは、継続条件が逆のため、継続条件が反転します。
継続の条件が違うだけで、後の処理はDo~While文と同様です。
Do~WhileとDo~Untilはどちらを使っても構いません。
ただし、なるべくどちらか一方に統一しましょう。
同じマクロの中でDo~WhileとDo~Untilが混在していると大変見づらくなり、混乱してしまいます。
筆者は、意味合いが分かりやすいDo~While文を使っています。
よく使う条件式について
Do~While文とDo~Until文の基本的な使い方について理解できたところで、よく使う条件式について紹介します。
第6回講座(If文の使い方)でもご紹介しましたが、おさらいも兼ねて再度ご紹介します。
よく使う条件式には次のようなものがあります。
<比較演算子>
比較演算子 | 条件 | 例(条件式) | 例(意味) |
---|---|---|---|
=(等しい) | Aの値がBの値と等しい場合 | Range(“A1”).Value = 70 | A1セルが70と等しい |
<>(等しくない) | Aの値がBの値と等しくない場合 | Range(“A1”).Value <> 100 | A1セルが100ではない |
>(より大きい) | Aの値がBの値より大きい場合 | Range(“A1”).Value > 70 | A1セルが70より大きい |
<(より小さい) | Aの値がBの値より小さい場合 | Range(“A1”).Value < 70 | A1セルが70より小さい |
>=(以上) | Aの値がBの値以上の場合 | Range(“A1”).Value >= 70 | A1セルが70以上 |
<=(以下) | Aの値がBの値以下の場合 | Range(“A1”).Value <= 70 | A1セルが70以下 |
<論理演算子>
論理演算子 | 条件 | 例(条件式) | 例(意味) |
---|---|---|---|
条件A And 条件B | AとB両方(全て)の条件を満たす場合 | Range(“A1”).Value >= 70 And Range(“B1”).Value < 50 | A1セルが70以上でB1セルが50より小さい |
条件A Or 条件B | AとBいずれかの条件を満たす場合 | Range(“A1”).Value >=70 Or Range(“B1”).Value > 60 | A1セルが70以上またはB1セルが60より大きい |
Not 条件A | 条件Aを満たさない場合 | Not Range(“A1”).Value =70 | A1セルが70に等しくない |
Do~While文を使って、例を見てみましょう。
次のような成績表があったとします。
この表に対して次の処理を行うマクロを作成します。
- 中間試験、期末試験ともに80点以上の場合は生徒名の背景色を黄色
- 中間試験、期末試験のどちらかが80点以上の場合は生徒名の背景色を緑色
VBAでは次のように記載します。
実行結果は次のようになります。
「If Cells(i, 3).Value >= 80 And Cells(i, 4).Value >= 80 Then」にて3列目(中間試験)が80以上、かつ4列目(期末試験)が80以上の場合に条件を満たします。
「ElseIf Cells(i, 3).Value >= 80 Or Cells(i, 4).Value >= 80 Then」にて、上記条件を満たさない場合で、3列目(中間試験)が80以上、または4列目(期末試験)が80以上の場合に条件を満たします。
このように、ループ処理では比較演算子と論理演算子を必ず使うので、使いこなせるようにしましょう。
Do~Loop文を入れ子にする(ネスト)
For文と同様、Do~Loop文も複数重ね合わせることができます。
Do~Loop文の中に、更にDo~Loop文を入れることを、入れ子にする(ネスト)といいます。
例を見てみましょう。
次のような成績表の点数が80点以上の背景色を黄色に塗りつぶすマクロを作ってみましょう。
VBAでは次のように記載します。
少し複雑なので、1行ずつ解説していくよ。
処理前準備
まず、処理のスタート位置をセットします。
変数「i」に行数、変数「j」に列数を格納します。
2行目、1列目から開始するため、「i = 2」「j = 3」をセットします。
外側のDo~Loop文
i行目、1列目(A列)が空白でない間、処理を継続します。
内側のDo~Loop処理が完了したら「i = i + 1」で行が1つ進みます。
内側のDo~Loop文
次に内側のDo~Loop文に入っていきます。
「j = 3」で3列目から処理がスタートします。
「Do While Cells(i, j).Value <> “”」で「i行目、j列目のセルの値が空白でない間処理が継続します。」
「j = j + 1」で列が一つ進みます。
j = 8まで進むとH2セルは空白のため、内側のDo~Loop文の処理が完了します。
外側のDo~Loop文に戻る
内側のDo~Loop文の処理が完了したら「i = i + 1」で行が1つ進みます。
続いて、3行目の処理に移ります。
同じようにj = 8まで進むとH3セルは空白のため、内側のDo~Loop文の処理が完了します。
全処理の完了
「i = 9」「j = 8」まで進むと全ての処理が完了します。
処理完了時の表は次のようになります。
Do~Loop文を使用する場合の注意点
Do~Loop文を使う場合に、絶対忘れてはいけない注意点があります。
それは変数の増減を忘れないようにするという事です。
次のVBA、何か大事な処理が抜けているけど、どこか分かるかな?
あ、変数を増やす「i = i +1」が抜けていますね。
その通り!この変数の増減を忘れると大変な事になるよ。
上記のマクロを仮に実行したとすると、2行目から行が進まず、永遠に処理が終わりません。
無限ループに陥ってしまいます。
無限ループ…。怖いですね。
万が一変数の増減を忘れて無限ループに陥ってしまった場合の対処方法を教えておくね。
無限ループの抜け方
万が一無限ループに陥ってしまったら、キーワードのエスケープキー『Esc』を押しましょう。
処理中断のメッセージが表示されるので、【終了】ボタンを押します。
これで処理を中断させる事が出来ます。
中断ができたら、変数の増減を追加しましょう。
ループ処理を抜ける(Exit Do)
For文同様、Do~Loop文も途中で処理を抜ける事ができます。
ループ処理を抜けるにはExit Doを使います。
具体例で見てみましょう。
次の表でNo.3までで処理を中断するマクロを作ってみましょう。
VBAでは次のように記載します。
次の部分で、i行目・1列目(No.)が3より大きい場合は処理を中断します。
Exit Do
End If
このマクロを実行すると次のようになります。
No.4,5,7も80点以上のため条件を満たしていますが、処理が4以上の場合は処理が中断されるため、No.3で処理が終了します。
For文と同じように、余計な処理をしないよう、ループを抜ける判断をする癖をつけよう。
まとめ
ループ処理として、Do~Loo文の使い方について解説しました。
- Do~Loop文は「Do~While文」と「Do~Until文」の2種類がある
- Do~While文は条件を満たす間処理を繰り返す
- Do~Until文は条件を満たすまで処理を繰り返す
- Do~Loop文を使うときは変数の増減を必ず忘れずにしよう!
- Exit Doでループ処理を抜ける癖をつけよう
Do~Loop文は、For文と違い、処理の回数が決まっていない時に使うことが出来ます。
色々な条件でループ処理が出来て便利な反面、変数の増減を忘れると無限ループに陥ってしまう可能性もあります。
変数の増額は忘れないように記述する癖をつけましょう。
For文とDo~Loop文をマスターすれば、複雑なマクロも作る事ができるようになります。
ぜひご自身で簡単なマクロを作ってみてDo~Loop文をマスターしましょう。
最後までお読みいただき、ありがとうございました!
~天然マクロ学校~
コメント