Step指定は「カウンタの増え方・減り方を決めるつまみ」
For文は、
For i = 1 To 10
' 繰り返し処理
Next i
VBのように書くと、i が 1,2,3,4,…,10 と「1ずつ」増えながらループします。
この「1ずつ」の部分を、自分でコントロールするための仕組みが Step指定 です。
「2ずつ進めたい」「逆向きに減らしたい」「5行おきに処理したい」
こういう“進み方のルール”を決めるのが Step の役割です。
Step指定の基本構文と動きのイメージ
基本構文
書き方はこうです。
For 変数 = 開始値 To 終了値 Step 増分
' 繰り返したい処理
Next 変数
VB増分(Step に指定する値)は、
正の数なら「増える」、負の数なら「減る」方向に進みます。
何も書かなければ、デフォルトは Step 1 です。
つまり、いつもの For文は「暗黙に Step 1 が指定されている」と考えてOKです。
2ずつ進める例
Sub SampleStep2()
Dim i As Long
For i = 1 To 10 Step 2
MsgBox i
Next i
End Sub
VBこのときの i の変化は、
1 → 3 → 5 → 7 → 9 → 次は 11(10を超えるので終了)
という流れになります。
「開始値からスタートして、Step ずつ増やしながら、終了値を超えたら終わり」
これが Step の基本ルールです。
Step指定で「行を飛ばしながら処理する」実用例
A列の奇数行だけに値を入れる
Sub SampleOddRows()
Dim i As Long
For i = 1 To 10 Step 2
Range("A" & i).Value = "奇数行"
Next i
End Sub
VBこのコードは、
A1, A3, A5, A7, A9 にだけ「奇数行」という文字を入れます。
i が 1,3,5,7,9 と変化していくので、
Range(“A” & i) は “A1″,”A3″,”A5″,”A7″,”A9” となります。
「1行おきに処理したい」「2行ごとに色を変えたい」
といったときに、Step 2 はとてもよく使います。
5行おきに処理する
Sub SampleEvery5Rows()
Dim i As Long
For i = 1 To 50 Step 5
Range("A" & i).Value = "ここでマーク"
Next i
End Sub
VBi は 1,6,11,16,…,46 と進みます。
「一定間隔でマークを付ける」「5行ごとに集計する」など、
“間隔”を意識した処理に Step はぴったりです。
Stepをマイナスにして「逆順ループ」を書く
下から上へ向かって処理する
Sub SampleReverse()
Dim i As Long
For i = 10 To 1 Step -1
MsgBox i
Next i
End Sub
VBこのときの i の変化は、
10 → 9 → 8 → … → 1 → 次は 0(1より小さいので終了)
という流れです。
「上から下へ」ではなく「下から上へ」処理したいとき、
例えば「行を削除しながら上に詰める」ような処理では、
逆順ループが安全なことが多いです。
逆順で行を削除する例
Sub SampleDeleteRows()
Dim i As Long
For i = 10 To 1 Step -1
If Range("A" & i).Value = "削除" Then
Rows(i).Delete
End If
Next i
End Sub
VB上から削除していくと、行が詰まってインデックスがずれてしまいますが、
下から削除していけば、まだ見ていない行の番号は変わりません。
「削除を伴う処理は、Step -1 で逆順に回す」
これは実務でかなり役立つパターンです。
Step指定と「終了条件」の関係をしっかり理解する
ループが止まる条件
For文は、
開始値からスタートして
Step ずつ増減させて
「終了値を超えた(または下回った)」時点で止まる
というルールで動きます。
例えば、
For i = 1 To 10 Step 3 ' 1,4,7,10 → 4回
Next i
VBi は 1 → 4 → 7 → 10 → 次は 13(10を超えるので終了)
となり、4回ループします。
一方、
For i = 1 To 10 Step 4 ' 1,5,9 → 3回
Next i
VBこの場合は、1 → 5 → 9 → 次は 13(10を超えるので終了)
となり、3回ループです。
「終了値にぴったり届くかどうか」は重要ではなく、
「終了値を超えたら終わり」というのが本質です。
Stepの符号と開始値・終了値の関係を間違えると一度も回らない
For i = 10 To 1 ' Step を書かない → デフォルトは +1 → 一度も回らない
Next i
VBこのように、「10から1へ向かいたいのに Step を書かない」と、
i は 10 → 11…と増えていく方向になってしまい、
開始時点で「すでに終了値を超えている」ので、ループは0回で終わります。
逆に、
For i = 1 To 10 Step -1 ' これも一度も回らない
Next i
VBも同じです。
1 から 10 へ向かいたいのに、Step -1 で減る方向に進もうとするので、
開始時点で「終了値より小さい」状態になり、やはり0回で終わります。
「開始値から終了値へ、Step の符号の方向に向かって進んでいく」
このイメージを毎回頭の中で確認すると、Step指定のミスがかなり減ります。
Step指定を使うときの考え方のコツ
まず「手作業ならどう進めるか」をイメージする
例えば、
「A1, A3, A5, A7…だけ見たい」
と自分が手でやるなら、
1行目を見る
2行目は飛ばす
3行目を見る
4行目は飛ばす
…
というふうに、「2行おき」に進みますよね。
この「2行おき」が、そのまま Step 2 になります。
「自分の手がどう動くか」を先にイメージしてから、
それを Step の数字に落とし込むと、しっくりきやすいです。
「何が毎回変わっているか」を意識する
Step指定を使うときも、変わっているのは結局カウンタ変数 i です。
その i を、
行番号に使う
列番号に使う
配列のインデックスに使う
など、「どこに差し込んでいるか」を意識して読むと、
ループの動きが頭の中で再生しやすくなります。
まとめ:Step指定は「ループのリズムを決めるダイヤル」
Step指定の本質は、
カウンタ変数が
どれくらいの間隔で
どちらの方向に進むか
を決める“リズム設定”です。
押さえておきたいポイントをコンパクトに言うと、
開始値から終了値へ、Step ずつ増減しながら進む
Step を省略すると 1(1ずつ増える)
Step を正にすると順方向、負にすると逆方向
終了値を超えた(または下回った)時点でループ終了
「行を飛ばす」「逆順で処理する」「一定間隔で処理する」ときに特に有効

