For文を使った繰り返し処理
EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”for文を使った繰り返し処理”について紹介します!
繰り返し処理
前回、”Do~Loop文”を使った繰り返し処理について紹介させて頂きました。
今回紹介する、”for文”も繰り返し処理の一つです。”Do~Loop文”は条件が”true”や”false”の時に繰り返すものでしたが、”for文”は、予め繰り返す回数が分かる場合に便利に使える構文になります!
For文
‘カウンタ変数i 初期値0 最大値10とする
For i = 0 To 10
’ 処理
Next i
処理の流れを図で表すと、次のようになります。

for文の処理がスタートされると、まずは、カウンタ変数iに初期値(i = 0 to 10 の0)の0が設定されます。その後、条件式で最大値(i = 0 to 10 の10)以下かどうかの判定が行われます。条件式が”false”だと処理は終了。条件式が”true”の場合は、処理に進みます。そして処理が終わると、カウンタ変数iを1増加させて、再度条件式に進むという流れになります。
次の処理で具体的に考えてみましょう。
0~10までの数字に5を掛けた答えをイミディエイトウィンドウに表示する
解説しておきます。

「Dim i As Long」はカウンター変数の宣言です。0から10までで繰り返したいので「For i = 」に続き、「0 to 10」と指定します。
このように指定することで、カウンタ変数iに0から1ずつ増やしながら、最大値10まで処理を繰り返します。
実行時の全体のコードはこちらです。
Sub test()
Dim i As Long
For i = 0 To 10
Debug.Print i * 5
Next i
End Sub
実行して、イミディエイトウィンドウで結果を確認してみましょう。

「0*5」「1*5」・・・・「10*5」までの答えが順番に出力されています。
【step】
次のように、「For i = 0 to 10」の次に、「Step 2」と入れると、2つおきに実行することもできます。「i」をそのままイミディエイトウィンドウに表示するコードを実行します。
Sub test()
Dim i As Long
For i = 0 To 10 Step 2
Debug.Print i
Next i
End Sub

「カウンタ変数i」が2ずつ増加しているのが分かります。「Step」の後の数字を変更することで、増加の数を変更することができます。
For Each文
先程のfor文では、カウンタ変数の数を指定して繰り返し回数を決めて繰り返しを行いましたが、このfor Each文を使うと連想配列などの中身全てを一つずつ取り出して繰り返し処理を行うことができます。
Dim d As Variant
For Each d in 連想配列や配列
// 処理
Next
処理の流れを図で表すと、次のようになります。

連想配列や配列について、復習もしときましょう。
次の図で表せるように、小分けにした箱にデータを入れて、ひとまとめで管理するものでしたね。

For Each文を使うことで、箱を一つずつ取り出して各々に処理をすることができます。

こんなイメージです。
それでは次のコードで試してみます。
person(連想配列)を作って、そのプロパティと中身の値を全てログに書き出すプログラムです。
Sub test()
'宣言
Dim person As Object
Set person = CreateObject("Scripting.Dictionary")
'登録
person.Add "name", "たろう"
person.Add "age", 32
person.Add "gender", "男"
person.Add "birthday", "1987/1/1"
'呼び出し
Dim d As Variant
For Each d In person
Debug.Print d
Debug.Print person(d)
Next
End Sub
実行してみましょう。

イミディエイトウィンドウに全てのプロパティと、中身の値が表示されました。
取り出してるところをもう少し詳しく解説します。

「For Each d in person」の「変数d」に「person」のキーが順に格納されます。この時、変数dは文字列型で格納されることに注意してください。
最初の「Debug.Print」では、「d」を指定していますので、文字列型のキーがそのまま表示されます。「name」なら「name」と表示されますね。
そして、2つ目の「Debug.Print」では、連想配列の呼び出しの方法である「ブラケット記法」が使われています。変数dは文字列型なので、ブラケット記法の()丸括弧の中に指定ができます。
※注意:For Each文は取り出す順番は保証されていないので、順番に取り出したい場合は注意する必要があります。
まとめ
For Each文による繰り返し処理(ループ処理)を説明しました。いかがでしたでしょうか?繰り返し処理が出来ることでプログラムの幅がぐっと広がりますね!
コメント