Step2 基礎

【STEP2 基礎6】繰り返し・ループについて

繰り返し(ループ)処理

次に、繰り返し処理について説明します。
繰り返し処理は、ループ処理と呼ばれます。
こちらのほうがよく使われる表現なので、この講座内ではループ処理と呼ぶことにします。

ループ処理というのは

ということです。
「ある条件を満たすまで、何回も処理を繰り返すこと」
これをループと呼びます。

Excelの関数ではループ処理はできません
VBAを使えばループ処理ができることも、
VBAを使う理由の一つです。

ループ処理の基本のかたち

For カウンター変数 = はじまりの数値 to 終わりの数値

    繰り返したい処理①

    繰り返したい処理②

    繰り返したい処理③

Next カウンター変数

という書き方をします。

10回繰り返す場合を日本語で書いてみると

For:1からはじめて10になるまで(1,2,3・・・10)

    処理①を実行する

    処理②を実行する

    処理③を実行する

Next:ここまで、処理を繰り返す

 

はじまりの数値を1増やして、
終わりの数値とイコールになるまで、
For
に戻って繰り返す
を自動的に実行します。

このループ処理は次のことを意識して組み立てます。
*どこからどこまで(For~Next)
*何回繰り返す(カウンター変数)
*何を処理する

カウンター変数とは

VBAの「変数」については、実はまだ、この講座では学んでいません。
この講座では、ループ処理のカウンター変数の動きを知ることが「変数」の概念をつかむのに良いのではと考えています。
普通は、まずは変数を教えてから、ループ処理を学ぶという順番なのですが、より理解度を高めるために、あえてこの順番で教えています。

ループ処理の中で、カウンター変数という言葉が出てきました。
カウンター変数は、その名の通り、「回数をカウントするもの」のことです。

プログラミングの世界では、変数と呼ばれるものには変数名(名前)が付いています。
ループ処理でカウンター変数の変数名としてはiという文字がよく使われます。
もちろん「i」を使わなければならないということではなく、他の文字でも動作します。

カウンタ変数に「i~n (i,j,k,l,m,n)」の文字を使うのは昔からの慣習なのですが、理由は特に知らなくてもOKです。
FORTRANというプログラミング言語の仕様として、i~nが整数として使われていて・・・うんぬん。
という難しい話を聞くはめになるので。

ここではカウンター変数として「i」を使って説明します。

For i = 1 to 5

    処理①

Next i

と書いた時には、どういう動作をするかというと、
「処理①が5回繰り返し実行」
という動きをします。

例えば処理①に

Cells(1,1).Value = 100

と書くと、A1セルに5100が書き込まれます。

A1セルが100になるだけで、見た目は特に変化ありません。

この時、カウンター変数の「i」はどういう変化をするかというと、

1回目 i=1
2回目 i=2
3回目 i=3
4回目 i=4
5回目 i=5

と増えていきます。
5回目にi5になるので、処理①が実行されたら、Next i で For に戻らないで、このループを抜けます。

例えば

Cells(1,1).Value = 0



For i = 1 to 5

  Cells(1,1).Value = 100

Next i



Cells(1,1).Value = 200

と書かれていたとすると、

「A1セルに0を入力」(順次処理)
「A1セルに100を5回入力」(ループ[繰り返し]処理)
「A1セルに200を入力」(順次処理)

となって、最終的にA1セルは200になります。

これは、ただ単に、上から下まで実行して、A1セルが変化しただけです。

先ほど、カウンター変数 i の値 がループする毎に増えていくという話をしました。
 iの値がループする度に増えていく(減っていく)ので、カウンター変数と呼ばれているのです。

iの値が、増えたり、減ったりと変化していくのであれば、これをうまく使えないでしょうか?

例えば

For i = 1 to 5

    Cells( i , 1 ).Value = 100

Next i

と書いたら、どのように動くと思いますか?

1回目 Cells( 1 , 1 ).Value = 100
2回目 Cells( 2 , 1 ).Value = 100
3回目 Cells( 3 , 1 ).Value = 100
4回目 Cells( 4 , 1 ).Value = 100
5回目 Cells( 5 , 1 ).Value = 100

となって、Cells( i , 1 ).Value の「 i と書いた箇所が変化していきます。

もちろん 「 i 」 は、に書いてもOKです。

For i = 1 to 5

    Cells( 1 , i ).Value = 100

Next i

1回目 Cells( 1 , 1 ).Value = 100
2回目 Cells( 1 , 2 ).Value = 100
3回目 Cells( 1 , 3 ).Value = 100
4回目 Cells( 1 , 4 ).Value = 100
5回目 Cells( 1 , 5 ).Value = 100

ちなみに、「 i 」を行と列、両方に書いてもOKです。

For i = 1 to 5

    Cells( i , i ).Value = 100

Next i

1回目 Cells( 1 , 1 ).Value = 100
2回目 Cells( 2 , 2 ).Value = 100
3回目 Cells( 3 , 3 ).Value = 100
4回目 Cells( 4 , 4 ).Value = 100
5回目 Cells( 5 , 5 ).Value = 100

となります。

わかりますか?
値が変化するカウンター変数「 i 」をうまく使って、連続してセルに値を入力できるのです。

他にも

For i = 1 to 5

    Cells( i , 1 ).Value = i

Next i

といった書き方をすると

1回目 Cells( 1 , 1 ).Value = 1
2回目 Cells( 2 , 1 ).Value = 2
3回目 Cells( 3 , 1 ).Value = 3
4回目 Cells( 4 , 1 ).Value = 4
5回目 Cells( 5 , 1 ).Value = 5

となり、i をセルの値として入力もできるのです。

おわかりいただけたでしょうか?
なかなか最初はイメージしにくいかもしれません。

ループ処理を理解するには、カウンター変数がどのように動作し、どのように使えるのかを理解する必要があるのです。
カウンター変数を理解することは、次に学ぶ、変数の理解にもつながってくるのです。

カウンター変数をnとします。

Cells( 1 , “N”)
Cells( 1 , n )

の違いを知っておきましょう。

Cells( 1 , “N”)という書き方は、N1セルを表しますね。
Range(“N1″)と同じです。
cells(1,n) と書いた時、nは変数で、nの値によって列が変わります。

cells(1,”N”) はN列は「N」固定のままで変わりません。
“”で囲っているかどうかの違いです。
“”で囲っていると、文字そのものを表します。
変数名を書くと、その変数の値に置き換わります(変数の展開とよびます)。
少しむずかしいですが、この違いを理解しておきましょう。

★ここが重要
Forで使うカウンタ変数は、自動的に増えたり減ったりする
変化するカウンター変数はセルの指定にも使える

カウンター変数の増減間隔の決め方

ここまでカウンター変数は1づつ増えるという説明をしてきました。

カウンター変数は、何も指定をしなければ1づつ増えます
ここで増減する値をきちんと指定してみましょう。

For i = 1 to 5 Step 1

    Cells( i , 1 ).Value = i

Next i

Forの最後に Step 1 を付けます。

Stepの後の数字は、増減数です。

For i = 1 to 5 Step 1(i = 1,2,3,4,5 と1づつ増える)
For i = 1 to 9 Step 2(i = 1,3,5,7,9 と2づつ増える)

もちろんマイナスも指定できます。
その時は、はじまりの数字が終わりの数字よりも大きくないと、ループが終了できなくなります。
これを、終わりなきループということで、「無限ループ」と呼ばれ、プログラムを強制的に停止しなければならなくなります。

なのでカウンター変数を減らしていく場合には、

For i = 5 to 1 Step -1(i = 5,4,3,2,1 と1づつ減る)

のように書きます。
i は 5から1つづ減っていって、1になったらループを終了して抜けます。

ループの階層化(ネスト)

ループは階層化することもできます。
階層化というのは、ループの中にループを入れるということです。

For i = 1 to 3 Step 1

    For j = 1 to 3 Step 1

        Cells( i , j ).Value = i + j

    Next j

Next i

と書けるということです。

これはどういう動きをするかというと。

ちょっと難しいですが、このように動きます。

実際に実行されるのは、

Cells( 1 , 1 ).Value = 1 + 1(=2)
Cells( 1 , 2 ).Value = 1 + 2(=3)
Cells( 1 , 3 ).Value = 1 + 3(=4)
Cells( 2 , 1 ).Value = 2 + 1(=3)
Cells( 2 , 2 ).Value = 2 + 2(=4)
Cells( 2 , 3 ).Value = 2 + 3(=5)
Cells( 3 , 1 ).Value = 3 + 1(=4)
Cells( 3 , 2 ).Value = 3 + 2(=5)
Cells( 3 , 3 ).Value = 3 + 3(=6)

9回の処理が実行されます。

この動きを頭の中でイメージできるようになることが大切です。
Excelの表は格子状になっているため、処理する時には、この形をよく使います。

繰り返すたびに、i j が変化して行き、それぞれが行と列の値になることを利用します。
VBAのループ処理では、このカウンター変数をうまく利用して処理を行っていくことになります。
カウンター変数を使いこなせるかどうかがポイントなのです。

繰り返し処理には、For〜Next の他に、Do〜Whileという形や、For Each 〜 という形もあります。
まずはFor〜Nextを使えるようになってから覚えて使ってみましょう。

繰り返し・ループの形

A1からA3に100を入れる

For i = 1 to 3

    Cells( i , 1 ).Value = 100

Next i

A1からA10まで1から1づつ増やして数字を入れる(1,2,…10)

For i = 1 to 10

    Cells( i , 1 ).Value = i

Next i

A1からA10まで2から2づつ増やして数字を入れる(2,4,…20)

For i = 1 to 10

    Cells( i , 1 ).Value = i * 2

Next i

A10からA1まで10から1づつ減らして数字を入れる(10,9,…1)

For i = 10 to 1 Step -1

    Cells( i , 1 ).Value = i

Next i

A1からC3の範囲に200を入れる

For i = 1 to 3

    For j = 1 to 3

        Cells( i , j ).Value = 200

    Next j

Next i

A3からA6に100を入れる

For i = 3 to 6

    Cells( i , 1 ).Value = 100

Next i

カウンター変数は、1から始めなくてもいいので、こういう書き方もできます。

以上、繰り返し・ループの説明でした。