はじめに
シート上の表について VBA マクロで何らかの処理を行いたい場合、繰り返し処理である For 文について理解しておく必要があります。
ここでは初心者向けに繰り返し処理と表の扱い方について説明します。
繰り返し処理の For 文について理解する
VBA で繰り返し処理を行いたい場合ほとんどのケースで For 文を使用することになります。
まずは以下の VBA コードを作成して実行してみてください。
Option Explicit
Sub sample1()
Dim i%
For i = 1 To 5
MsgBox "i = " & i
Next
End Sub
このマクロを実行すると以下のようにメッセージボックスが順に表示されるはずです。
この結果から以下のことに気づくと思います。
MsgBox
を 1 行しか書いていないのにメッセージボックスが 5 回表示されたi
の値が 1 から 5 まで変化している
それでは For 文について説明します。
For i = 1 To 5
これは、変数 i
の値の初期値を 1 と設定していて、かつ i
の値が 1 から 5 の範囲内である限り処理を繰り返し実行することを意味しています。
MsgBox "i = " & i
For
と Next
の間に記述されているこれは、For 文で実行する処理内容に該当します。このマクロ例では変数 i
の値をメッセージボックスで表示します。
Next
これは、For 文の終わりを意味するとともに、ここまで処理が進んだら変数 i
の値を元の値に対して 1 を加えた値に更新します。そして新たな i
の値が 1 から 5 の範囲内である場合は For 文内の先頭に戻って処理を繰り返します。
For 文の構文
For 文を使用する場合は以下の構文になります。
For [変数] = [初期値] to [最大値]
'繰り返し実行したい処理内容
Next
また For 文の中では上の構文の 1 行目で記述した変数の値を使用することができます。
この変数の値を For 文内で使用することがポイントになります。
上で記載しているマクロの例でも For 文内で変数 i
の値をメッセージボックスで表示する内容として使用しています。
縦一列の表の値を読み取る
それでは For 文を使用して表を扱っていきます。
まずは、以下のようなシンプルな縦一列の表の値を対象にして考えてみます。
B3 セル~B7 セルまでの値を順にメッセージボックスで表示するマクロを作成してみます。
VBA コードの例は以下の通りです。
Option Explicit
Sub sample2()
Dim i%
Dim cell_value%
For i = 3 To 7
cell_value = ActiveSheet.Cells(i, 2).value
MsgBox cell_value
Next
End Sub
このマクロを実行すると以下のようにメッセージボックスが順に表示されます。表の中の値が順に表示されていることが分かるかと思います。
For 文で表を扱うときのポイントは以下の部分です。
For i = 3 To 7
つまり、For 文で使用している変数の値の範囲と、シート上の表の値が記載されている行番号の範囲を一致させています。
これによって、
- For 文内の 1 回目の繰り返しの処理は表の 1 行目を対象とした処理
- For 文内の 2 回目の繰り返しの処理は表の 2 行目を対象とした処理
- For 文内の 3 回目の繰り返しの処理は表の 3 行目を対象とした処理
といったように対応付けることができます。
マクロ例
以下のような表があったとします。C 列に B 列の値の 2 倍の値を入力するマクロを作成してみます。
VBA コードの例は以下の通りです。
Sub sample3()
Dim i%
Dim cell_value%
For i = 3 To 7
cell_value = ActiveSheet.Cells(i, 2).value
ActiveSheet.Cells(i, 3).value = cell_value * 2
Next
End Sub
このマクロを実行すると以下のように C 列に値が入力されます。
For 文内の処理では、i
行目 (3-7 行目) について以下を行っています。
- B 列のセルの値を取得する
- 取得した値の 2 倍の値を C 列のセルに入力する
For 文の仕組みが分かれば、こういった処理は簡単にマクロ化できることができます。
表全体の値を 2 重の For 文で 取得する
以下のような表があったとします。この表内の値をすべて順にメッセージボックスで表示することを考えます。
VBA コードの例は以下の通りです。
Sub sample4()
Dim i%
For i = 3 To 7
MsgBox ActiveSheet.Cells(i, 2).value
MsgBox ActiveSheet.Cells(i, 3).value
MsgBox ActiveSheet.Cells(i, 4).value
Next
End Sub
このマクロを実行すると以下のように順に値が表示されます。
VBA コードの For 文の部分についてですが、この例では表の 1 行につき 3 列分の値があるため、For 文内に 3 行の処理を記述しています。
For i = 3 To 7
MsgBox ActiveSheet.Cells(i, 2).value
MsgBox ActiveSheet.Cells(i, 3).value
MsgBox ActiveSheet.Cells(i, 4).value
Next
ここで、例えば対象の表が 100 列あった場合、For 文内に 100 行書くことになります。
しかしそれは大変であり、コードの行数が増えて見づらくなってしまいます。
このようなときは、For 文を 2 重に使うことですっきりしたコードにすることができます。
上の VBA コード例について、 For 文を 2 重に使うように書き換えた場合以下のようになります。
Sub sample5()
Dim i%, j%
For i = 3 To 7
For j = 2 To 4
MsgBox ActiveSheet.Cells(i, j).value
Next
Next
End Sub
変数 j
を新たに定義して、一つ目の For 文の中にもう一つ For 文を記述しています。
ここでのポイントは、j
の値と表の列番号を対応付けることです。
今回の例では、表は 2 列目から 4 列目まであるため、以下のように For 文で j
の値の範囲を 2 から 4 と指定しています。
For j = 2 To 4
以上のように、2 重の For 文を使用することで、表のすべての行、すべての列について値を取得したり処理をしたりすることが可能となります。
2 重 For 文は初心者にとっては分かりづらいと思うので、慣れるまで繰り返し VBA コードの作成と実行結果の確認を行ってみてください。
おわりに
For 文を使った繰り返し処理は、マクロを作成する上で基本的な要素の一つであり、必須と言っても良い処理です。
For 文をマスターできればマクロの作成がし易くなるはずなので、慣れるまでは繰り返しマクロの作成と実行結果の確認を行ってみてください。