繰り返し処理「For Next」の基本と応用
「繰り返し処理」は、マクロを効率よく動作させる上で欠かせない内容です。
もしも、この繰り返しするコードを利用しない場合、例えば、各行に順番に色をつけていこうとしています。
Cells(1, 1).Interior.Color = RGB(255, 0, 0)
Cells(2, 1).Interior.Color = RGB(255, 0, 0)
Cells(3, 1).Interior.Color = RGB(255, 0, 0)
このコードでは、A列の背景色を1行ずつ設定しています。3行程度の処理であれば、これでいいかもしれませんが、実務上で3行だけしか処理しないということはほとんどありませんよね?
この処理対象が1000行や10000行になると、このまま続けるとコードの量が膨大になり、コードを書くことに疲弊して、せっかく効率化のためにマクロに取り組んだのに、本末転倒になってしまいます。
ここで登場するのが今回の繰り返し処理を行うために「For Next」構文です。
For構文の使い方
For Next構文は、一定の範囲内で処理を繰り返す場合に使用します。
基本形は次の通りです。
For 変数 = 開始値 To 終了値 Step 増減値
繰り返したい処理
Next 変数
- 開始値: 繰り返しを始める数値
- 終了値: 繰り返しを終える数値
- 増減値: 繰り返し時の変化量(省略すると1ずつ増える)
開始値、終了値とかくと、少々わかりづらいですが、例えば、1行目〜100行目まで処理したい場合、「開始値:1」「終了値:100」と記載することで1〜100行目を順番に処理してくれるコードになります。
コード例
次のコードでは、変数 i が1から1000まで1ずつ増加し、A列のセルの背景色が順番に赤く塗られます。
コードをシンプルにするためにこのような説明をしましたが、実務上はここにさらに「IF構文」などを使い、各行の状況に応じて、「その行のA列が◯であれば、色をつける」など、条件を判断した上で色をつけるようなコードを作ることが多いです。
Sub bgcolor()
Dim i As Long
For i = 1 To 1000
Cells(i, 1).Interior.Color = RGB(255, 0, 0)
Next
End Sub
応用例と注意点
基本的な例をお話ししましたが、さらに応用して利用することができます。
増減値の話をしませんでしたが、増減値は省略すると基本的には1ずつ増加するので、先ほどのように1〜100行とすると、1、2、3、4、5・・・と順番に処理をしていきます。
この増減値は省略せずに増減値を2以上などのすることが可能です。
増加量(Step)の変更
例えば、「2行おき」に処理をする場合、Stepの後は2とすれば、2行ごとに処理をします。
交互に色をつけたい場合など、白、グレー、白、グレー・・・のように処理をさせることができます。
For i = 1 To 1000 Step 2
Cells(i, 1).Interior.Color = RGB(0, 255, 0)
Next
「逆順」に処理する
また、プラスだけでなく、マイナスの処理をすることができます。
よく利用する場面としては行の削除や、列の削除をする場合には、行や列が移動してしまうので、上から順番に処理すると、思っていた動作になりません。
例えば、5行目が削除された場合、元々の6行目が5行目になりますが、マクロの動作は4、5、6・・・と進んでいくため、5行目が削除されたら、次は6行目の動作を行いますが、5行目が削除された後の6行目というのは、元の7行目になるわけです。
そのため、元の6行目(新しい5行目)に関しては、何も動作せずになってしまいます。
これを回避するためには、「行を削除したら上に詰まる」動作を理解した上で、下から順番に操作を行えば、元の行が移動したとしても、影響を受けることはありません。
これについては、例えば、次のようなコードを書きます。
For i = 1000 To 1 Step -1
If Cells(i, 1).Value = "削除" Then
Rows(i).Delete Shift:=xlUp
End If
Next
このコードを記載すれば、A列に「削除」と入力されていれば、削除されますが、行が削除されたとしても、7、6、5の順番で処理されるので、仮に6行目が削除されても、次の5行目は元の5行目のままなので問題ない、ということです。
For構文の省略
For構文の記載内容は一部、省略することができます。
・Step 1
は省略可能です。
・Next
の後に変数名を書く必要もありません。
For i = 1 To 1000
Cells(i, 1).Interior.Color = RGB(255, 0, 0)
Next
実用例:条件に基づく処理
For Next は、セルや行の内容に応じた柔軟な操作にも活用できます。
先ほども記載した例もありますが、例えば、次のような処理が可能です。
指定の条件で削除
A列の値が「削除」の場合、その行を削除
For i = 1000 To 1 Step -1
If Cells(i, 1).Value = "削除" Then
Rows(i).Delete Shift:=xlUp
End If
Next
特定の文字列に応じた処理
A列の値が「都道府県」の場合、B列にコピー
For i = 1 To 1000
If Cells(i, 1).Value Like "*都道府県*" Then
Cells(i, 2).Value = Cells(i, 1).Value
End If
Next
まとめ
For Nextは、「行ごと」「列ごと」「シートごと」など、繰り返し処理を効率化するための構文です。
今回の例ではセルの背景色を操作しましたが、条件付きでコピーや削除を行うなど、様々な応用が可能です。
繰り返し処理はマクロの基本機能の一つなので、ぜひ習得して業務の効率化に役立てましょう!
コメント