For Nextの基本的な使い方について知りたい
繰り返し処理を途中で終了したりスキップしたい
あなたはFor Nextステートメントを使ってますか? For Nextステートメントは繰り返し回数を数えるカウンタが所定の回数に到達するまで繰り返し処理を行う場合に使われます。
繰り返し処理はあらゆるプログラミング言語で最も基本的な処理となります。
この記事では、For Nextステートメントの使い方という基本的な内容から、繰り返し処理を途中で抜けたりスキップする応用的な使い方まで5つのステップで理解できるようになっています。
- For Nextの基本
- Exit Forでループを抜ける方法
- GoToでループをスキップする方法
- For Nextのネスト(入れ子)
- For Eachで配列を操作する方法
ぜひFor Nextステートメントの基本を理解して実務で役立ててください。
VBAのFor Nextステートメントとは
For Nextステートメントは、繰り返し回数を数えるカウンタが所定の回数に到達するまで繰り返し処理を行う場合に使われます。For Nextステートメントは以下のように記述します。
For カウンタ名 = 初期値 To 到達値 処理 Next カウンタ名
繰り返し回数を数えるカウンタ名を指定し、それの初期値から到達値に達するまで繰り返し処理を行います。
VBAのFor Nextを理解するための5つのステップ
VBAのFor Nextの基本的な使い方
ここではFor Nextステートメントの基本的な使い方を理解しましょう。
まずは簡単な例として、初期値に1、到達値に10を入れた場合は1 ~ 10まで繰り返し処理を実行することができます。サンプルコードで確認しましょう。
Sub macro1() Dim arr() As Variant, i As Integer, str As String arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) For i = 0 To 9 str = str & arr(i) & ", " Next i MsgBox str End Sub
実行結果:
このサンプルコードではまず、Variant型の配列arrを宣言、初期化しています。そしてFor NextステートメントのカウンタにInteger型の変数iを指定し、配列arrの要素にインデックス番号0(ゼロ)から順にアクセスしています。
Stepの使い方
Stepステートメントを使うことでループを1回まわすごとのカウンタ値の増減数を変えることができます。以下のように記述します。
For カウンタ名 = 初期値 To 到達値 Step 増減数 処理 Next カウンタ名
ちなみに、増減数が1の場合は「Step 増減数」の部分は省略することができます。サンプルコードで確認しましょう。
Sub macro1() Dim arr() As Variant, i As Integer, str As String arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) For i = 0 To 9 Step 2 str = str & arr(i) & ", " Next i MsgBox str End Sub
実行結果:
このサンプルコードではまず、Variant型の配列arrを宣言、初期化しています。そしてFor NextステートメントのカウンタにInteger型の変数iを指定し、配列arrの要素にインデックス番号0(ゼロ)から順にアクセスしています。
Stepステートメントで2と設定しているので、2つおきにアクセスしています。
デクリメント(マイナス)で逆順に回す
Stepステートでマイナスの値を指定すると、デクリメント(マイナス)で逆順にループを回すことができます。サンプルコードで確認しましょう。
Sub macro1() Dim arr() As Variant, i As Integer, str As String arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) For i = 9 To 0 Step -2 str = str & arr(i) & ", " Next i MsgBox str End Sub
実行結果:
このサンプルコードではまず、Variant型の配列arrを宣言、初期化しています。そしてFor NextステートメントのカウンタにInteger型の変数iを指定し、配列arrの要素にインデックス番号の大きい値から順にアクセスしています。
カウンタiの増減数は-2ですので、配列arrの要素を1つずつ飛ばしながらアクセスしています。
Exit Forでループを抜ける方法
ループ処理では、ある条件を満たすとそれ以降は処理を行わずにループから抜けたい場合があります。そんな場合にはExit Forステートメントを使用します。
サンプルコードで確認しましょう。
Sub macro2() Dim i As Integer, subject As String For i = 2 To 10 If Not IsNumeric(Range("B" & i)) Then subject = Range("A" & i) Exit For End If Next i MsgBox subject & "には数値以外の値が入っています" End Sub
実行結果:
このサンプルコードでは、Excelシートの点数部分のセルに数値以外の値が入力されていないか確認を行い、数値以外の値が確認されればFor Nextステートメントのループから抜けるように記述しています。セルに数値が入力されているか、それ以外か確認するためにIsNumeric関数を用いています。
IsNumeric関数は引数が数値の場合はTrueを返し、それ以外はFalseを返します。物理以外の教科でも数値以外の値が入力されていますが、そちらは表示されていませんので物理の5行目まででFor Nextステートメント内の処理は終了していることがわかります。
GoToでループをスキップする方法
ループ処理では、ある条件の場合はそれ以降の処理を省略してループ内の先頭の記述にスキップしたい場合があります。VBA以外のプログラミング言語だとcontinueを使うのが一般的ですが、vbaの場合はGoToステートメントを使用します。
サンプルコードで確認しましょう。
Sub macro3() Dim i As Integer, sum As Integer For i = 2 To 10 L1: If Not IsNumeric(Range("B" & i)) Then i = i + 1 GoTo L1 End If sum = sum + Range("B" & i) Next i MsgBox "合計点数は" & sum & "点です" End Sub
実行結果:
このサンプルコードでは、Excelシートのセルに入力されている点数の合計を求めています。セルに数値以外の値が入力されている場合は、GoToステートメントを使って合計を算出する処理をスキップして、For Nextステート内の先頭にあるラベルL1にジャンプしています。
GoToステートメントについては、こちらでも詳しく解説していますので、ぜひ参考にしてください。
For Nextのネスト(入れ子)
For Nextステートメントの中に、さらにFor Nextステートメントを記述することができます。これをネスト(入れ子)といいます。
サンプルコードで確認しましょう。
Sub macro4() Dim i As Integer, j As Integer, str As String For i = 1 To 3 For j = 1 To 4 str = str & i & "年" & j & "組" & ", " Next j str = str & vbCrLf Next i MsgBox str End Sub
実行結果:
For Eachで配列を操作する方法
繰り返し処理を行うよく似たステートメントにFor Eachステートメントがあります。For Eachステートは、配列やコレクションなどのグループの各要素に対して繰り返し処理を行う場合に使用します。
詳しくはこちらのサイトで説明していますので、ぜひ参考にしてください。
まとめ
ここでは、For Nextステートメントについて説明しました。For Nextステートメントは繰り返し処理が必要な場合によく使われます。
ある条件を満たす場合に処理が省略できるようであれば、余計な処理は実行せずにループから抜けたり、スキップするなどして高速化できるようになりましょう! 使いこなすことができるように、この記事を何度も参考にして下さいね!