処理を組んでいると、同じ処理を何度も繰り返して行いたい場合が出てきます。
そんな時に使えるのがFOR文です。
今回はこのFOR文について紹介していきます。
追記: PropsRoomというスキル情報メディアを運営しています。
こちらでもVBA入門ガイドを扱っています。
https://props-room.com/articles/handbook/vba-guide-1
FORの特徴と使い方
FOR文ってなに?
まず、FOR文を知る前に、繰り返し処理とはどういったときに使うものかを紹介します。
例えば下のような、あるセルからあるセルまで点数の入ったセルがあり、
このセルの横に点数に応じて「優」「良」「可」「不可」を出力させる処理を作るとします。
この場合、「C列のセルの点数を確認して、D列の隣のセルに結果を出力させる」という処理をAさん~Fさんまでの6回繰り返してあげると、同じ処理を何度も何度も記述しなくても済みます。
このような処理を繰り返したい時にFOR文を使用します。
FOR文の書き方
FOR文は下のように記述します。
変数はFOR文の繰り返し用にInteger型(数値)の物を用意しておきます。
その変数に=して繰り返しを始める値(0や1が無難です)とToの後ろに最後の値(最大値)を記述します。
そして、Stepの後ろに1回の繰り返しで増加させる値を記述します。
これで、変数の値が「始めの値」~「終わりの値」までの間、For~Nextの間に書かれた処理を繰り返し、「増やす値」ずつ変数の値が変化していきます。
※「増やす値」が1なら変数の値が「1,2,3,4,5~」と増え、2なら「2,4,6,8~」と増えていく。
動きを確認してみよう
実際に処理を書いて動かしてみましょう。
下のコードは繰り返した数を表示させる処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub MessageTest() Dim Hensu As Integer 'FOR文に使う変数 Dim LoopNo As Integer '繰り返した数を保持する変数 LoopNo = 0 For Hensu = 1 To 50 Step 1 LoopNo = LoopNo + 1 'この処理を通ると「LoopNo」に+1される Next MsgBox LoopNo End Sub |
Forの中の処理では「LoopNo」という変数に1を足しています。
この処理を通るごとに「LoopNo」が1ずつ増えていきます。
FOR文を抜けた後に、「LoopNo」の値をメッセージで出力させます。
実際にこの処理を実行すると下のメッセージが表示されました↓
結果は「50」と出力され、この処理を50回行ったことが分かります。
FOR文の使い方はこんな感じです。
では、先ほど例で挙げた点数に応じた結果をセルに表示させる処理を考えてみましょう。
繰り返すのは人数分の計6回なので、最大値に6、繰り返す処理の中身は前回紹介したCase文を活用してあげれば、できそうです。
Case文についてはこちらを参照ください
これらをもとに組んだのがこちら↓
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 |
Sub MessageTest() Dim Hensu As Integer 'FOR文に使う変数 Dim Point As Integer 'セルから取得した点数 Dim Moji As String '結果に表示させたい文字を保持 '6人分処理を繰り返す For Hensu = 0 To 5 Step 1 'C列のセルから点数を取得 「&」を使う事で文字列として連結出来る Point = Range("C" & (3 + Hensu)).Value '点数によって表示させる文字を取得 Select Case Point Case Is >= 80 Moji = "優" Case Is >= 60 Moji = "良" Case Is >= 50 Moji = "可" Case Else Moji = "不可" End Select '取得した結果をD列のセルに入れる Range("D" & (3 + Hensu)).Value = Moji Next End Sub |
FOR文の条件では、0~5までの6回の繰り返し処理としています。
なぜHensuの初期値が1からではなく0かというと、FOR文の中の処理で、Hensuをセルの行数に足して出力させる行を切り替えたかったからです。
そして、「Range(“C” & (3 + Hensu)).Value」とすることによって、C列の3行目以降を繰り返すごとに1行ずつ下に切り替えることが出来ます。
例えば、Hensuに0が入れば、
「Range(“C” & (3 + 0)).Value」→「Range(“C3”).Value」
Hensuに1が入れば、
「Range(“C” & (3 + 1)).Value」→「Range(“C4”).Value」
というような感じになります。
実際に実行してみると下のようになりました↓
FOR文の中でさらにFOR文を使う
FOR文の中でさらにFOR文を入れ込んで処理を複雑に繰り返すこともできます。
例えば、下のような九九の表を作成する場合、このような方法で列と行それぞれをFOR文で繰り返させることで1まとまりの記述だけで作成することが出来ます。
コードはこのようになります↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub MessageTest() Dim LoopCol As Integer 'FOR文に使う変数 Dim LoopRow As Integer 'FOR文に使う変数 Dim DanCol As Integer '列の九九の段セルから取得した点数 Dim DanRow As Integer '行の九九の段セルから取得した点数 'B~J列の9回分処理を繰り返す For LoopCol = 1 To 9 Step 1 DanCol = Cells(2, LoopCol + 1).Value '3~11行の9回分処理を繰り返す For LoopRow = 1 To 9 Step 1 DanRow = Cells(LoopRow + 2, 1).Value Cells(LoopRow + 2, LoopCol + 1) = DanCol * DanRow Next Next End Sub |
なにやら複雑なコードになっていますが、やっている事は単純です。
1つ目のFOR文で列数をセットしています。
2つ目のFOR文で、セットされた「列の段」と3~11行目までの「行の段」を掛けて結果を3~11行に繰り返して表示させています。
2つ目のループが全て終わると、1つ目のFOR文の繰り返しが1回分終わり、次の列に移動します。
そして、この処理を9列目まで繰り返しています。
また、Cells()はセルの列数と行数を指定して、セルを選択することが出来ます。
「Cells(行数,列数).Value」で指定したセルの値を扱う事が出来ます。
実際に実行してみたのがこちら↓
まとめ
FOR文は同じ処理を何回か行いたいときに使える文法でした。
でも、FOR文を使うには繰り返したい回数が分かっていないといけないので注意です。
次回は繰り返す回数がわからない場合に使えるWhile文を解説します。
■次のページ