前回の記事で、処理を繰り返し行いたい時に使うFOR文について紹介しました。
しかし、FOR文の場合、繰り返したい回数が決まっていないと使う事が出来ません。
今回紹介するWhile文は繰り返したい回数がわからない時、繰り返しを行う場合の条件を設定して繰り返し処理をさせることが出来ます。
追記: PropsRoomというスキル情報メディアを運営しています。
こちらでもVBA入門ガイドを扱っています。
https://props-room.com/articles/handbook/vba-guide-1
While文とは?
While文はFOR文と同じく、繰り返し処理を行う時に使う文法です。
違う点は、繰り返し条件の指定の仕方です。
前回、FOR文を使う例として下のような場合を紹介しました。
D列に結果を表示させる処理を「Aさん~Fさん」までの六人分繰り返し処理を行えばよかったのですが、この人数が増えたり減ったりした場合、FOR文だけでは対処できません。
こんな時にWhile文が役に立ちます。
While文は回数を条件に指定するのではなく、指定した条件が正しい(True)場合、繰り返し処理をします。
上の例の場合、名前列に名前が書かれている場合処理を繰り返し、書かれていない空白のセルに当たったとき、繰り返しを終了させるように設定することが出来ます。
While文の使い方
While文の書き方
Whileの隣に条件を記述し、条件が満たしていれば、下の処理を行います。
処理が行われると、また上のWhileに戻ってきて条件が満たしているか確認します。
条件が満たさなくなった場合、While文を抜けて、下のコードに進むようになります。
このようなグルグル回るような流れで繰り返し処理が行えます。
実際に動かしてみよう
どんな動きをするのか、実際に動かしてみましょう。
まずはカンタンな動作から。
下のコードをコピーして、モジュールに貼り付けて実行してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub MessageTest() Dim LoopNum As Integer 'While文の条件に使う Dim MsgCode As String 'メッセージに出力させる文字 LoopNum = 0 '初期値として0を入れる 'LoopNumが5よりも小さい場合処理を繰り返す While LoopNum < 5 MsgCode = MsgCode + "あ" '繰り返すごとにMsgCodeに「あ」を連結していく LoopNum = LoopNum + 1 '繰り返すごとにLoopNumの値に1を足していく Wend MsgBox MsgCode End Sub |
コメントに書いてある通りですが、「LoopNum」という変数の中身が5より小さい場合、Whileの中の処理を行います。
中の処理では「MsgCode」という変数に「あ」をくっつけています。
そして、「LoopNum」の値に+1させています。
実際に動かしてみた結果がこちら↓
「あ」が5つ連結されて表示されています。
While文で繰り返し処理が5回行われたことが分かりますね。
また、上で紹介した点数に応じた結果を出力させる処理を繰り返しさせるのはこのように記述します↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Sub MessageTest() Dim NameCell As String 'FOR文に使う変数 Dim Row As Integer '行数 Dim Point As Integer 'セルから取得した点数 Dim Moji As String '結果に表示させたい文字を保持 NameCell = Range("B3").Value '名前の記述が始まる最初のセル Row = 3 '名前の記述が始まる最初の行 '名前がある人数分処理を繰り返す While NameCell <> "" '空白(""で空白の意味)ではない限り繰り返し処理 'C列のセルから点数を取得 「&」を使う事で文字列として連結出来る Point = Range("C" & Row).Value '点数によって表示させる文字を取得 Select Case Point Case Is >= 80 Moji = "優" Case Is >= 60 Moji = "良" Case Is >= 50 Moji = "可" Case Else Moji = "不可" End Select '取得した結果をD列のセルに入れる Range("D" & Row).Value = Moji 'Rowの行数を1追加して下の行に移動する Row = Row + 1 '次の行の名前を取得 NameCell = Range("B" & Row).Value Wend End Sub |
ここで行っている事は、前回の記事でFOR文を使って作ったコードをWhile文に切り替えているだけです。
Whileの中身の処理は基本的に一緒ですが、Whileの条件に「セルの値が空白でなければ」と記述しているので、繰り返し処理の中で、繰り返すごとに下の行のセルの値を入れ直しています。
実際の動きがこちら↓
強制的に繰り返し処理から抜けたい場合
Whileの条件以外で繰り返し処理を止めたい場合、While~Wendの間に「Exit」を記述させれば抜けることが出来ます。
使用時の注意点
Whileの条件を指定する時、必ずどこかで終了出来るように指定させるようにしましょう。
というのは、どんなに繰り返し処理を行っても条件を満たし続けると無限ループになってしまうからです。
無限ループが起きると、「オーバーフロー」というエラーになり処理が中断されてしまいます。
まとめ
繰り返し処理を行う場合は、状況に応じてFOR文とWhile文を使い分けましょう。
でも、While文は予期しないパターンで無限ループになってしまう恐れがあるので、極力FOR文を優先的に使った方がいいと私は思います。