マクロVBA講座ブログ

事務職をしていて身についたマクロVBAを紹介する人

【Excel】初めてのマクロVBA制作【基本編】  - For文 -

早いこと第4弾となりますが、今回はマクロを組むのに重要な For文を説明していきたいと思います。
リストや集計表ではかなり使用する動作ですので是非とも覚えていってください。
まぁ、覚えられなくともその都度調べて組むことができるようになれば正直問題はないのかなと思います。


For文とは?

マクロVBAを組むうえで繰り返し処理を行う時に使用される動作が For文となります。
必ず変数を使用することとなりますが、詳しい説明は今回はしません。なので、今回は For文の一部にこんなものを使う必要があると思っていてください。

また、基本的な動作としては For ~ Next の間の処理を決まった回数繰り返す動作となります。
コード例としては以下となります。

【コード例】

Sub Test_For()

Dim i As Long

For i = 1 To 10 Step 1
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'この間の処理を繰り返し行います。
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next i

End Sub

入力の基本としては、「For i = 最低値 To 最大値」となります。
上記では「i = 1 To 10」にて 1 ~ 10 になるまで処理を行います。10よりも大きい数字になると繰り返し処理は終了となり Next 以降の処理が開始します。また、「Step 1」は 1 ~ 10 になるまで1ずつ足していく数字となり「Step 1」は省略することができます。また、1つ飛ばしの処理を行う場合は「Step 2」とすると1つ飛ばしが可能となります。
詳しい説明は次の項目を見ていただければと思います。

nekunomon.hatenablog.com

■For の使い方■

基本例①:通常処理

1つ目は通常の処理である、1つずつ処理を行う動作となります。
【コード】

Sub Test_For①()

Dim i As Long

    For i = 1 To 10

        Cells(i, 2) = i

    Next i

End Sub


【結果画面】

上記のマクロを起動するとセルの B1 ~ B10 に i の中身である 1 ~ 10 までの数字が入力される処理となります。最大値が決まっているリストや連続の番号を振るときによく使われます。また、横にも移動が可能となり上記のコードを Cells(2,i) に変更すると 2 行目に連続の数字が横に入力されます。

基本例②:Stepによる処理

2つ目は、1つ以上飛ばしの処理となります。
【コード】

Sub Test_For②()

Dim i As Long

    For i = 1 To 10 Step 2

        Cells(i, 2) = i

    Next i

End Sub


【結果画面】

上記では1つずつ飛ばした処理となります。奇数だけの条件で入力する場合は上記でもいいですが、偶数だけの条件としたい場合は 「For = 2 To 10」と最低値を偶数にするといいでしょう。また、Step数を 3 とすると 2つ飛ばしの処理を行う事ができます。

基本例③:縦横の処理

3つ目は For を2つ使った縦と横の移動処理となります。
【コード】

Sub Test_For③()

Dim i As Long
Dim j As Long

    For i = 1 To 10              '横の移動
        For j = 1 To 13          '縦の移動
        
            Cells(j, i) = j      'jの入力
        
        Next j                   '縦の繰り返し
    Next i                       '横の繰り返し

End Sub


【結果画面】

上記のコードは、縦の処理が終わった後に横へ移動する処理の流れとなります。
For を2回使う場合は、2回目のFor文の処理が終わるまで1回目のFor文は保留となります。

結果画面にて説明すると 「A列の 1 ~ 13 まで入力」「 B列へ移動し 1 ~ 13 を入力」...をA列から数えて10回繰り返しています。今回は表全体へ入力を行っていますが、条件を指定して入力を行うといった使い方がメインになるかと思います。

■実践応用■

応用例①

以下の表では点数を元に"赤点"を入力するマクロを組んでいます。

【表】


【コード例】

Sub Test_For_RED()

Dim i As Long

    For i = 1 To 10
        
        If Cells(i, 3) <= 30 Then
        
            Cells(i, 4) = "赤点"
        
        End If
    Next i

End Sub

※ If文 : 指定された条件を元に間の処理を行うか判定する動作


【結果画面】


上記のコードは For文と If文を使っての赤点判定となります。
このくらいの内容であれば関数を使用した方がいいと思いますが、入力と同時に変えたくないという場合はこのようなマクロがあると変わることがないので1つの方法としてはありかと思います。

応用例②

応用例①のさらに実用性を上げたバージョンが以下の表となります。
各教科の赤点判定と合計を算出するマクロとなります。

【表】


【コード例】

Sub Test_For_RED()

Dim i As Long

    For i = 4 To 13
        For j = 4 To 12 Step 2
        
            If Cells(i, j) <= 30 Then
        
                Cells(i, j + 1) = "赤点"
        
            End If
        
                Cells(i, 14) = Cells(i, 14) + Cells(i, j)   '合計の加算
        
        Next j
    Next i
End Sub


【結果画面】

上記では、For を2つ使い赤点の判定を行っており Step にて判定箇所を飛ばしながら"赤点"の入力を行っています。また、Cells 内に +1 の計算式を追加することで隣のセルを指定し"赤点"を入力しています。隣を指定する方法として offset もありますが範囲指定の場合はすべてずれてしまう点があるため今回は計算式を追加することで解決しています。

合計に関しては点数が書かれたセルと合計が書かれたセルを足して合計を算出しています。変わった計算式かと思いますが、この算出方法はマクロVBAでは他の処理で使用するため覚えておくといいでしょう。

まとめ

今回は For文を使った繰り返し処理を説明してきましたが、繰り返し処理はこれ以外にも存在しています。ただし、使い方を間違えると永遠に処理をし続けて Excel が落ちるなんてこともあります。
そういった意味では For文のように最大値を決めて動作させる方が安心できます。
ただ、最大値が決まっている事は少なくリストの追加が発生するため For文だけでは対応できない処理もあります。毎回、マクロを修正してもいいのですが作った人がいなくなった時に残された人のことを考えるとそれはおすすめできないためもっと拡張性が高いマクロを作る必要があるでしょう。
今後の記事ではマクロを組めない人でも設定をするだけで使いやすく拡張性があるものも紹介していきますので期待してお待ちいただけると幸いです。

では、今回の記事はここまでとなります。
次回は If文を使った分岐処理を説明していきます。

ここまで、見ていただきありがとうございました。