かばくん
同じような処理を何回も行うとき、
1行ずつ書いていたら、すごい行数になってしまいました・・・
へびせんせい
そういうときは反復処理を行うといいです。
プログラミングをやっているとほぼ必ずでてくるでしょう。
反復処理はFor構文を使って行います。
反復処理(繰り返す)といえば、For文を使う
Contents
Forの基本構文1 添字型
For文(添字型)の基本形
処理(True)
Next 添字
For基本形 サンプルコード
Sub for文()
Dim i As Long
For i = 1 To 10
MsgBox ("10回表示されます")
Next i
End Sub
添字についてですが、インデックスやループカウンタとも呼ばれます。
For文の処理を何回繰り返すのかをコントロールするためのものです。
上のコードのように、添字(インデックス)の初期値と最終値を決めると、その中で添字が1ずつ増加して最終値に到達するまで処理を繰り返します。
添字(インデックス)は整数型の変数で定義しておく必要があり、その名前は何でも良いのですが、添字として使う変数はiやjが使われるのが一般的です。
*Nextの後の添字は省略可能です
なぜiが使われるようになったのか?
インデックス(index)の頭文字の i をとって使われるようになったというのが有力
そして、Forの中にさらにForを使うときは、i の次の j や k が使われる
また、次のように、処理の中に添字を使うこともできます。
For処理中に添え字を使う サンプルコード
Sub for文2()
Dim i As Long
For i = 1 To 10
Cells(i, 2).Value = i
Next i
End Sub
次のような動作となります。
i=2のとき、Cells(2, 2) に2の値を代入する
i=3のとき、Cells(3, 2) に3の値を代入する
・・・
i=10のとき、Cells(10, 2) に10の値を代入する
となって、Forの処理が終了します。
結果は、B列の1から10行目に1から10の値が入ることになります。
For文を使って、Cellsを指定するのは超重要!
For文の入れ子(ネスト)で使う
For文をネスト構造で使うこともよくあります。
どういう流れで動作するかを、しっかり理解しましょう。
Forネスト構造 サンプルコード
Sub for文3()
Dim i, j As Long
For i = 1 To 10
For j = 1 To 10
Cells(i, j).Value = i * j
Next j
Next i
End Sub
次のような動作となります。
j=1となり、Cells(1, 1) に1*1の値を代入する
j=2となり、Cells(1, 2) に1*2の値を代入する
j=3となり、Cells(1, 3) に1*3の値を代入する
・・・
j=10となり、Cells(1, 10) に1*10の値を代入する
i=2のとき、
j=1となり、Cells(2, 1) に2*1の値を代入する
j=2となり、Cells(2, 2) に2*2の値を代入する
j=3となり、Cells(2, 3) に2*3の値を代入する
・・・
j=10となり、Cells(2, 10) に2*10の値を代入する
・・・
i=10のとき、
j=1となり、Cells(10, 1) に10*1の値を代入する
j=2となり、Cells(10, 2) に10*2の値を代入する
j=3となり、Cells(10, 3) に10*3の値を代入する
・・・
j=10となり、Cells(10, 10) に10*10の値を代入する
となって、Forの処理が終了します。
i と j がどう更新されていくかを、把握しよう!
Stepを使って、添字の増加量を変える
あまり使うことはないのですが、添字の1ずつ増加を2ずつや3ずつといったように変更することができます。
処理(True)
Next 添字
Stepを使ったFor サンプルコード
Sub for文4()
Dim i As Long
For i = 1 To 10 Step 2
MsgBox ("5回表示されます")
Next i
End Sub
Stepのあとの数値ぶんiの値が増えるので、i = 1, 3, 5, 7, 9となり、5回処理が動作します。
もし、Stepが3ならどうでしょうか?
i = 1, 4, 7, 10となり、4回処理が動作することになります。最終値が入るか入らないかに気をつけましょう。
Forの基本構文2 For Each型
For文(For Each型)の基本形
処理(True)
Next 要素
For Each型では、グループ(コレクションや配列)の各要素に対して繰り返し処理を行うことができます。
要素については、オブジェクト型かVariant型の変数しか指定できません。
添字型と異なり、要素の数だけ自動的に処理が行われるので、上手く使うと便利ですが、扱い方が難しいのも特徴です。
ForEach基本形 サンプルコード
Sub for文5()
Dim myrange As Range
For Each myrange In Range("A1:A5")
myrange.Value = "For Each文"
Next myrange
End Sub
正直、For Each文はオブジェクト型や配列をしっかり理解した後に使えればよいです。
まずは、上記の添字を使ったFor文を覚えましょう。
For文についての練習問題
へびせんせい
A1セルに1、A2セルに2、A3セルに3・・・と数字を入力せよ。
数字は30まで到達したところで、再び、1から順に30まで入力されるものとし、これを12回繰り返せ。
つまり、A360セルに30が入力されて処理が終わる。
*A列にカレンダーの日付(29や31は考えなくてよい)が入力されるようなイメージである