和風スパゲティのレシピ

日本語でコーディングするExcelVBA

データをひとつ飛ばしでループする - For Step

データをひとつ飛ばしでループする方法を解説します。

For Nextステートメントの引数Stepを使用します。

基本構文

For カウンタ変数 = 初期値 To 最終値 Step カウンタを進める値

    ' ここにループしたい処理

Next

サンプルコード

Dim ws処理シート As Worksheet
Set ws処理シート = ThisWorkbook.Worksheets("○○")

Dim 最終行 As Long
最終行 = ws処理シート.Cells(ws処理シート.Rows.Count, 1).End(xlUp).Row

' 行をひとつ飛ばしでループ
Dim R As Long
For R = 2 To 最終行 Step 2
    
    ' 処理例:C列=A列×B列
    ws処理シート.Cells(R, 3) = ws処理シート.Cells(R, 1) * ws処理シート.Cells(R, 2)
    
Next

解説

データをひとつ飛ばしでループしたい場合は、
For Nextステートメントの引数Stepを使用します。


Nextに到達してForステートメントの先頭に戻る際、
Stepで指示した数だけカウンタ変数に加算される仕組みです。

よって、Step 2とするだけでひとつ飛ばしでループさせることが出来ます。


Stepを3にすればふたつ飛ばしでループさせることが出来ますし、
Stepを-1にすることで逆順ループをかけることも可能です。

便利な記述なので覚えておきましょう。

最終値ピッタリに到達しない場合の挙動

Stepを使用する上で心配になるのが、
ひとつ飛ばしで進んだ結果、最終値を飛ばしてしまうとどうなるかです。

が、この点については安心してよく、
最終値を超えたところでしっかりと停止してくれます。

For i = 1 To 100 Step 2
' ↑これは99,101と100を通らないが、99を最終ループにForを抜ける

For i = 1 To 100 Step 30
' ↑1, 31, 61, 91 で終了

停止位置をちょうど〇の倍数に調整する必要はありませんのでご安心ください。

別解:偶数奇数の判定で行う

ひとつ飛ばしでループするには以下のコードをを用いる方法もあります。

Dim ws処理シート As Worksheet
Set ws処理シート = ThisWorkbook.Worksheets("○○")

Dim 最終行 As Long
最終行 = ws処理シート.Cells(ws処理シート.Rows.Count, 1).End(xlUp).Row

' 行をひとつ飛ばしでループ
Dim R As Long
For R = 2 To 最終行 Step 2
    If WorksheetFunction.IsEven(R) Then

        ' 処理例:C列=A列×B列
        ws処理シート.Cells(R, 3) = ws処理シート.Cells(R, 1) * ws処理シート.Cells(R, 2)

    End If
Next

WorksheetFunction(シート関数)にある、
IsEven関数を使用して「偶数行だけを処理」しています。

もちろんIsOddを使えば奇数行だけを処理もできます。


Stepの機能が手軽で便利ですので基本はそちらを使えばOKですが、
Ifによる分岐の方が複雑な処理を記述できます。

必要に応じて使い分けてみてください。