Developer

【ExcelVBA】For…Nextステートメント2
2020.11.30
Lv1

【ExcelVBA】For…Nextステートメント2

For…Nextステートメント②

前回に続き今回は、「For…Nextステートメント」です。いくつかのバリエーションや補足をしていきます。

ループカウンタ

「For…Nextステートメント」を使用した繰り返し構文(ループ構文とも言います)は、ループカウンタと呼ばれる変数を使って繰り返す回数を制御しています。
ループカウンタを使用しないケースとしては、「特定の条件をループの終了条件にするケース」「配列やそれに準ずるものを使用して繰り返し回数を制御するケース」がありますが、どちらの場合も「For…Nextステートメント」では試すことができませんので、これらのステートメントが出てきたときに改めて紹介したいと思います。配列に関しても後述します。

「For…Nextステートメント」以外には次のステートメントがあり、それぞれ次のケースにて使用します。
・「Do…Loopステートメント」→「特定の条件をループの終了条件にするケース」
・「For Each…Nextステートメント」→「配列やそれに準ずるものを使用して繰り返し回数を制御するケース」

では、ループカウンタについて補足していきましょう。
以下は、前回と同じサンプルになります。

Sub VBA基礎第7回_1()
    Dim i As Integer
    
    For i = 0 To 4
        MsgBox i & "回目"
    Next i
End Sub

このループ構文でのループカウンタは「変数i」になります。繰り返す毎に変数の値が変っていきます。通常ではプラス1ずつ変化していきます。この変化量は「Step」を使用することで変えることができますが、ここでは一旦おいておきましょう。この「変数がプラス1されること」を「インクリメント」と言います。
ループカウンタは、そのループ構文が何回繰り返し処理を実行するのかを制御しています。使い方は通常の変数と変わりません。変数を使う前には、変数宣言を行わなくてはなりませんので、2行目に次の構文があることに注目しましょう。

Dim i As Integer

このように「Integer」型が非常によく使われます。
一般的によく使われるループカウンタの変数名は以下の通りです。
・i(今回使用しているもの)
・j
・k
・x
・y
・z
・count
・cnt(countの省略形)

好きなものを使用していただいて構いませんが、この連載の中では基本的に「i」「j」を使用していきます。

ループカウンタの初期値はほとんどの場合で「ゼロ」か「1」しかありません。
「何にするかわからない」など迷ってしまったらひとまず「ゼロ」にしてしまいましょう。間違っていたら後から変更すればよいのです。

Step構文

「For…Nextステートメント」には、Stepという構文があります。
「To」の後ろに「Step x」と記述し、xには整数を指定します。
「Step」を使用していないケースでは、ループカウンタは1ずつ増加していきましたが、「Step」を指定することで増加量を変更することが可能です。

使用例は次の通りです。

Sub VBA基礎第8回_1()
    Dim i As Integer
    
    For i = 0 To 4 Step 2
        MsgBox i & "回目"
    Next i
End Sub

4行目の「Step 2」のところに注目してください。これでループカウンタが2ずつ増加するようになります。
実際に実行すると、「0回目」→「2回目」→「4回目」となり、変数iが2ずつ増加し結果として3回しかループしていないことが分かるかと思います。

では、次はこの例を見てみましょう。

Sub VBA基礎第8回_2()
    Dim i As Integer
    
    For i = 0 To 3 Step 2
        MsgBox i & "回目"
    Next i
End Sub

変ったのは4行目の「To」の後ろです。「4」から「3」に変えてみました。
このケースでは、ループカウンタiは次のように変化していきます。

i = 0
i = 2 → ここでループ終了
i = 4 → ここは実行されない

構文では、「To 3」となっているため「i=3になったら終了」の意味ですが、iは2ずつ増加していくため偶数のみとなり「i=3」にはなりません。しかし「i=2」までメッセージを出力したあと、「i=4」になったところで繰り返しが終了しています。
このように、「To x」という記述は正確には「x以上になったら終了」という意味となります。

入れ子

さて、少し難しい内容になります。
ループ構文の中にさらにループ構文を記述する「入れ子」というプログラムを作ることが可能です。

Sub VBA基礎第8回_3()
    Dim i, j As Integer
    
    For i = 1 To 10
        For j = 1 To 3
            Cells(i, j) = i * j
        Next j
    Next i
End Sub

このプログラムを実行すると次のようになります。

[008-【ExcelVBA】For…Nextステートメント2-001.png]

このループが4行目に記述されています。これを便宜的に「iループ」といいます。

For i = 1 To 10

このループが5行目に記述されています。こちらは「jループ」といいます。

For j = 1 To 3

iループが外側に、jループがiループの内側に定義されています。
iループは1から10までの計10回ループします。一方で、jループは1から3までの計3回ループします。
実行結果は「i×j」の結果をExcelに出力しているのですが、注目して頂きたいのは、セルA1からセルC10範囲の全部で30個のセルに値が表示されていることです。つまり、「10 × 3」回の繰り返し処理(i×j)が実行されているのです。

なぜこのようなことになるのでしょうか。
プログラムの次の部分(ブルーの枠)に注目します。

外側のiループの繰り返す処理は、このブルーの枠の部分になります。
すなわち、iループが1回繰り返す毎に、jループが3回繰り返すことになるわけです。iループが1回繰り返す毎に、jループはリセットされ改めてj=1から3回繰り返すことになります。

最後に次の部分ですが

Cells(i, j) = i * j

ループカウンタiを行番号に、ループカウンタjを列番号にして、掛け算の実行結果をExcelのセルに表示するプログラムとなっています。iは1から10まで、jは1から3(すなわちA列からC列)まで繰り返しますので、実行結果がセルA1からセルC10範囲に出力されることになります。
ループの入れ子は難易度が高く、一見すると意味がわからないかもしれません。
前回、ループのプログラムを勉強するためのコツをお話ししました。1行ずつプログラムを追ってみるでしたね。是非このループの入れ子プログラムでもプログラムを追ってみてください。
また、高度なプログラムではループの入れ子がさらに3つ、4つと増えたり、ループの中にIfステートメントが使われていたりすることもあります。まずは、基本となる2重のループの入れ子を理解できるようにしましょう。

次回は、「For…Nextステートメント」の少し実践的なプログラムを作ってみたいと思います。

宿題

1. For…NextステートメントとStepを使用して実行すると次のような結果となるプログラムを作成してください。
[008-【ExcelVBA】For…Nextステートメント2-003.png]

2. For…NextステートメントとStepを使用して実行すると次のような結果となるプログラムを作成してください。
[008-【ExcelVBA】For…Nextステートメント2-004.png]

3. ループの入れ子を使用して次のような結果となるプログラムを作成してください。
[007-【ExcelVBA】For…Nextステートメント1-005.png]

※ヒント
各セルに表示している値は「i + j」です。

 
 

連載目次リンク

ExcelVBA 入門 連載目次