みなさんこんにちは!
テラドと申します。
エクセルVBAのループ処理では
- For文
- Do~While文
- Do~Until文
と、3つの構文が使えます。
「とりあえずFor文を使っておこうかな」
「Do~While文・Do~Until文って、どう使い分けるんだろう」
このようにループ処理の構文を使うとき、自信がない方が意外と多いのではないでしょうか。
3つの構文をどう使いわければいいか、解説します!
For文を使うのは、どんな時?
繰り返す回数が決まっているとき
For文は、1~10回までなど 繰り返す回数が決まっている時に使います。
例として4行目~10行目のセルの背景色を変えるプログラムを書いてみます。
Sub sample()
Dim i As Long
For i = 4 To 10
ThisWorkbook.Sheet1.Cells(i, 2).Interior.Color = RGB(255, 255, 0)
Next
End Sub
このプログラムを実行すると
↑セルの色が塗り変わりました。
この例のように、オブジェクトの状態・変数の値などの変化する状況に左右されず、繰り返す回数が決まっている場合にFor文を使います。
さらに、ExcelVBAでよくある実例を使って理解を深めましょう。
ループ内で条件分岐がある場合
次の表データを見てください。
表データの3列目を走査(セルに設定されている値を順番に確認)して、地域が関東である都道府県名のセルに色をつけます。
ループ処理の中に条件分岐(地域=関東の場合)がありますが、走査する範囲が決まっている場合は「繰り返す回数」が決まっているため、For文の使用が適切です。
Sub sample()
Dim i As Long
For i = 3 To 12
With ThisWorkbook.Sheet1
If .Cells(i, 3).Value = "関東" Then
.Cells(i, 2).Interior.Color = RGB(255, 255, 0)
End If
End With
Next
End Sub
このプログラムを実行すると
↑地域=関東の都道府県のセルの色が塗り替わりました。
表データの列を走査する範囲が決まっている場合は、For文を使うのが適切です。
ループ内の処理に条件分岐があっても、For文の利用が適切かどうかは、処理する回数(=走査する範囲)が決まっているかを基準にシンプルに考えてください。
データの追加がないか確認しよう
都道府県の表データに新しいデータ(レコード)が追加されると最終行が変化します。この場合、繰り返し回数が決まっていないため、For文は適していません。
表データを扱うプログラムでは、表データに追加があるか・ないかで使う構文が変わります。
Do~While文を使うのは、どんな時?
For文とDo~While文を比較してみよう
繰り返す回数が決まっていない場合は、For文は適していません。
この場合に使用するのがDo~While文です。
実は、For文で示した4行目~10行目のセルを塗る事例と同じ処理を、Do~While文を使っても、実現することが可能です。
Do~While文とFor文の違いを比較してみましょう。
Sub sample()
Dim i As Long
i = 4
Do While i <= 10
ThisWorkbook.Sheet1.Cells(i, 2).Interior.Color = RGB(255, 255, 0)
i = i + 1
Loop
End Sub
For文との違いがわかりましたでしょうか。
Do~While文の場合、変数の初期値の代入と、変数を1ずつ増やす処理を、自分で記述する必要があります。
(プログラムの5行目(i = 4)と11行目(i = i + 1))
繰り返す回数が決まっているループ処理は、Do~While文でも実現はできます。しかし、無駄な処理はバグ(不具合)の原因になります。
繰り返す回数が決まっている時は、無駄のないFor文を使いましょう。
では、どういう時にDo~While文を使うか、具体的な事例を見ていきます。
継続条件が変化する場合
Do~While文を使うときはFor文と違って、処理の継続条件が、オブジェクトの状態や変数の値など変化する状況の場合に使います。
下の画像は、さきほどFor文の事例で示したExcelとまったく同じものです。
この表の1列目が空白でない場合、2列目に100を加算するプログラムを書きます。
Sub sample()
Dim i As Long
i = 1
With ThisWorkbook.Sheet1
Do While .Cells(1, i).Value <> ""
.Cells(i, 2).Value = .Cells(i, 2).Value + 100
i = i + 1
Loop
End With
End Sub
このプログラムを実行すると
↑1列目が空白でないセルに、100が加算されました。
Cells(1, i).Value <> "" = セルの値が空白でない限り
表データのセルの状態が処理を継続する条件になっています。
その証拠に、表データを変化させて同じプログラムを実行してみましょう。
↑11行目、12行目に値を追加してみました。
再度、プログラムを実行すると
↑追加した11行目と12行目にも値が設定されたのがわかります。(1~10行目には、すでに100が設定されていたので、値が200になります。)
このように処理を継続する条件が、変化する状況の場合はDo~While文を使用します。
Do~Until文を使うのは、どんな時?
Do~Until文とDo~While文を比較してみよう
Do~Until文とDo~While文に、どういう違いがあるかわかりにくいですよね。
Do~While文で示した事例を、Do~Until文で書き換えると、違いがよくわかります。
Do~Until文を使ったプログラム
Sub sample()
Dim i As Long
i = 1
With ThisWorkbook.Sheet1
Do Until .Cells(i, 1).Value = ""
.Cells(i, 2).Value = .Cells(i, 2).Value + 100
i = i + 1
Loop
End With
End Sub
Do~While文を使ったプログラム
Sub sample()
Dim i As Long
i = 1
With ThisWorkbook.Sheet1
Do While .Cells(1, i).Value <> ""
.Cells(i, 2).Value = .Cells(i, 2).Value + 100
i = i + 1
Loop
End With
End Sub
違いがわかりましたか?
ループ処理の条件式(9行目)が、「<>」から「=」に反転していますね!
逆に言うと、それ以外の違いはまったくありません。
Do~While文とDo~Until文は、やっていることは同じだが、条件が反転することを、覚えてください。
Do~Until文を使う場合は、Do~While文の場合の条件が反転するだけなので
終了条件が変化する場合
となります。
書籍、他のブログでの説明では
- Do~While文は条件が真のときに処理を継続する
- Do~Until文は条件が偽のときに処理を継続する
と書かれています。
でも、Do~Until文の偽のときに処理を継続するって、直感的に理解しにくくないですか?
- Do~While文は「継続条件」を書く
- Do~Until文は「終了条件」を書く
とシンプルに覚えましょう。
では、Do~While文とDo~Until文の使い分けを、条件が反転することを踏まえて考えてみます。
Do~While文とDo~Until文の使い分けは、理解のしやすさで判断
Do~While文とDo~Until文の使い分けはズバリ!
人間がみたときに条件を理解しやすいこと
これに尽きます!
例えば「あるデータを見つけたら、処理を終了したい」という仕様があったとき
Sub sample()
i = 1
Do While ThisWorkbook.Sheet1.Cells(i,1).Value <> "終了"
i = i + 1
Loop
End With
End Sub
Sub sample()
i = 1
Do Until ThisWorkbook.Sheet1.Cells(i,1).Value = "終了"
i = i + 1
Loop
End Sub
後者のほうが「あるデータを見つけたら、処理を終了したい」という仕様にマッチし、直感的に理解しすいと思います。
このようにDo~While文・Do~Until文は、やりたいことを直感的に表現できるほうを使いましょう!
Do~Until文はレアキャラかも?
複数人で開発をする時に、Do~Until文を使う場合は注意してください。
Do~Until文があるプログラミング言語は、意外と少ないのです。
私の知る限り、VB(VBA含む)・COBOL・Perlぐらいです。
Do~Until文になじみがないメンバーがいるかもしれません。少し乱暴ですがDo~While文・Do~Until文の使いわけで判断に迷うときは、Do~While文を採用しておけば間違いないと思います。
条件が反転しているだけで、やっていることに変わりはありませんから。
まとめ:For文・Do~Until文・Do~While文の使い分けフローチャート
エクセルVBAで使用できる、ループ処理の3つの構文について、それぞれの比較もしながら、説明してきました。
ノウハウとして使いやすいように、フローチャートで整理してみました。普段のプログラミング、チームメンバに説明するとき等に、ご活用ください。
フローチャートにしてしまうと、すごい簡単ですね!
最後までお読みいただき、ありがとうございました!
コメント
こんにちは、VB2.0時代から病院内の薬品・物品管理をAccessで作製していた経験が有り、このようなサイトは、とても重要だと感じております。
また、クラウドという概念が無い15年以上前に、Webを介して同じようなシステムを作ったことが有ります。
未だ医療・福祉分野での情報化は非常に遅れています。それは利用者様・患者様にとって有りがたくない状況だとも思います。
今後のご発展をお祈りしております。自分も勉強させて頂きます。どうぞよろしくお願い致します。
トシさん
コメントありがとうございます!
そうおっしゃっていただけると、大変うれしく思います。
医療・福祉分野でもITの活用が浸透していければいいですね。弊社も微力ながらも、引き続き日々情報発信をしていければと思います。
引き続き、どうぞよろしくお願いいたします。