今回はExcel VBAで繰り返しの処理をするFor文について解説します。
繰り返し処理の種類
VBAの繰り返しの処理は、大きく分けてFor文と使う場合とWhile文(Until文)を使う場合があります。実務ではFor文の方が使いやすく、まずはFor文から覚えた方がわかりやすいので、詳細はFor文のみ掲載します。その前提として、それぞれをどのようなケースで使用するのかを説明します。
For文:回数を指定して繰り返す
Forを用いた繰り返し処理は、繰り返す回数を指定します。詳細は後述しますが、例えば以下のような処理をしたい時に使います。
- ”A列からG列まで繰り返す”
- ”最終行から3行目まで繰り返す”
- ”最初のシートから最後のシートまで繰り返す”
- ”1行目から100行目まで10行おきに繰り返す”
While文(Until文):条件を指定して繰り返す
While(Until)を用いた繰り返し処理は、繰り返す条件を指定します。例えば以下のような処理をしたい時に使います。
- ”条件に当てはまるセルが10個になるまで繰り返す”
- ”セルが空白だったら処理を終える”
カウンタ変数
繰り返し処理において、カウンタ変数が頻繁に用いられます。カウンタ変数というのはその名の通り、数を数えるための変数です。上述の通り繰り返し処理においては”1から10まで”のように数を数える必要があります。数を数えるために、初期値を1とする変数を用意しておいて、その変数に+1していって、変数が10になったら繰り返しをやめる、という方法を用います。これをカウンタ変数と呼びます。概要を以下の図に纏めました。
カウンタ変数には、以下の例でも示す通り、”i”が最もよく使われます。これは恐らく”i”が”index”,”iteration”,”integer”などの頭文字だからだと推測できます。他には、”i”とアルファベットの並び順が近い”j”, “k”などがよく用いられます。
For文
まずはFor文を用いて回数を指定して繰り返し処理を実行する方法について解説します。
基本的な使い方
For文の基本的な使い方は以下のようになります。Nextに到達した時に規定回数に達していなければカウンタ変数をアップデートして処理を繰り返します。
For カウンタ変数 = 初期値 To 終了値 Step間隔(Stepは必要な時のみ)
処理内容
Next
繰り返しの指定の具体例を紹介します。
1から10まで繰り返す
For カウンタ変数 = 1 To 10
処理内容
Next
1から10までのように単純に+1ずつ加算する場合はStepは必要ありません。
10から20まで2つおきに繰り返す
For カウンタ変数 = 10 To 20 Step 2
処理内容
Next
このコードによって、カウンタ変数は10,12,14,16,18,20と変化します。
10から1まで繰り返す
For カウンタ変数 = 10 To 1 Step -1
処理内容
Next
カウンタ変数を大きな値から小さな値に変化させたい場合にはStepにマイナス値を指定します。Excelでシートの下から処理をかける場合に必要な処理です。
使用例
では次にFor文の使用例を紹介します。以下の表を使って、B列の値がバナナであればセルを黄色くするという処理をしましょう。
今回は整数型の変数としてカウンタ変数iを設定します。コードは以下の通りです。
Dim i As Integer
For i = 3 To 170
If Cells(i, 2).Value = “バナナ” Then
Cells(i, 2).Interior.ColorIndex = 6
End If
Next
実行結果は以下の通りです。
上記のコードは、For文以外に塗りつぶしやIf文による条件分岐を適用しています。それぞれ以下の記事を参照ください。
For文を使った複雑な繰り返し
For文を用いて、更に複雑な繰り返しを実行します。
Select Case文との併用
まず、For文を使ってイレギュラーな繰り返しを実行するためによく一緒に用いられるSelect Case文について紹介します。Select Case文は名前の通り、ある条件の時に処理を実行する条件分岐の構文の一種です。
今回は以下のように、不連続な範囲を塗りつぶすケースを考えます。
まずは1人分だけ色を塗ってみましょう。
Dim i As Integer, k As Integer
Range(Cells(4, 1), Cells(4, 9)).Interior.ColorIndex = 35
For i = 4 To 11
For k = 1 To 9
Select Case k
Case 1, 5, 9
Cells(i, k).Interior.ColorIndex = 35
End Select
Next k
Next i
少しコードが複雑になりました。まず、Select Case kというのは、変数kについて以下の条件を満たす場合のみ処理を実行します。その条件を示しているのがCase 1,5,9の部分です。この2行で、”kが1,5,9の時”という指示になります。kは列数に対応させていますので、A列・E列・I列ということになり、上のコードの実行結果としては以下の不連続に色を塗りたい部分を示すことができています。
入れ子(ネスト)構造
また上のコードでは、整数型の変数を2つ使っています。使用例では行数に該当する整数を格納するための変数iを用いましたが、今回は追加で列数の変数をkと設定しました。このように複数の変数を入れ子構造で使うことで、より複雑な処理が可能になります。
For i = 4 To 11
For k = 1 To 9
Select Case k
Case 1, 5, 9
Cells(i, k).Interior.ColorIndex = 35
End Select
Next k
Next i
上述のコードでは、セルの位置はCells(i, k)という2つの変数の組み合わせで示されます。このCells(i, k)というのが具体的にどのような値になるのかを見てみましょう。
まずはより外側のFor文で変数iが4に設定されます。そのFor文の内側で変数kが1->5->9と変化します。指定するセルは以下のように変化します。
- Cells(4, 1) => A4
- Cells(4, 5) => E4
- Cells(4, 9) => I4
これで変数kはゴールであるNext kに到達して一通りkの繰り返しが終了したので、変数iが1週目から2週目に移ります。変数iの2週目は5(1週目は4)が設定され、その内側では再度変数kが1->5->9と変化します。指定するセルは以下のように変化します。
- Cells(5, 1) => A5
- Cells(5, 5) => E5
- Cells(5, 9) => I5
これで変数iの2週目が終了し、続いて3週目、4週目…と続き、最後はi=11が設定されます。指定するセルは以下のようになります。
- Cells(11, 1) => A11
- Cells(11, 5) => E11
- Cells(11, 9) => I11
ご参考まで、Next後ろにカウンタ変数を書くのは必須ではありませんが、入れ子構造を用いる場合にはどのFor文に対するNextなのかが自分でわからなくならないように、書いています。
複雑な繰り返し処理
さて、次にこの処理を3人分まとめて実行しましょう。コードは以下の通りです。1人分の処理と共通部分が多いですが、異なる部分は太字にしています。新たな変数jによって入れ子構造が追加されています。
Dim i As Integer, k As Integer, j As Integer
For j = 0 To 20 Step 10
Range(Cells(4 + j, 1), Cells(4 + j, 9)).Interior.ColorIndex = 35
For i = 4 To 11
For k = 1 To 9
Select Case k
Case 1, 5, 9
Cells(i + j, k).Interior.ColorIndex = 35
End Select
Next k
Next i
Next j
変数jは以下の通りカウンタ変数として定義されています。これは、0から20まで10個飛ばしでという意味になり、実質的には”0,10,20”の3つの値を取ることになります。
For j = 0 To 20 Step 10
変数jを使うことで1人分の処理がどう変わるのか、以下の部分を例に解説します。変数jなしの場合には、色を塗る範囲はA4:I4ですが、変数jのを用いた繰り返しにより0,10,20を足すことで、j=0の時はA4:I4、j=10の時はA14:I14、j=20の時はA24:I24の色を塗ることができます。
- 変数jなし:Range(Cells(4, 1), Cells(4, 9)).Interior.ColorIndex = 35
- 変数jあり:Range(Cells(4 + j, 1), Cells(4 + j, 9)).Interior.ColorIndex = 35
実行結果は以下の通りです。
今回は3人分だけの繰り返しでしたが、人数が多くなるほどこうした複雑な繰り返し処理が有効になることが想像できるかと思います。変数jを変えるだけで、何人分でも繰り返すことができるのです。
コメント