【反復処理】For~Nextの使い方
-
Contents
- 今回の目標
- 説明
- 始めに
- ループ処理を行う(For~Next )
- If文と組み合わせる
- 他言語でFor文を学んだ方へ
- 基本構文
- break の代わりの[Exit For]
- continue の代わりの[Goto]
- Long型のススメ
- 確認テスト
- 関連リンク
今回の目標
- For~Nextの使用して反復処理をできるようになる
説明
始めに
他言語でFor文を習得されている方は、下記リンクをお読みください。
ページ内リンク:他言語でFor文を学んだ方へ
For文を知らない方はこのまま下の説明をお読みください。
For~Next の基本
基本構文を説明します。
以前、プログラムは上から順に実行されると説明しました。
しかし、今回の「For文」では一定の法則に基づき上へ戻ります。
For文の基本構文を端的に説明すると下記の通りになります。
For文を使用するには、事前に整数型変数を作成する必要がありますので、それを頭に入れて見てください。
For 整数型変数 = 変数の初期値 To 反復処理回数-(変数の初期値-1) Step 増加数・・・①
繰り返したい処理・・・②
Next 整数型変数・・・③
上記の解説をします。
①で、整数型変数に「変数の初期値」を代入します。
②で、処理を行います。2つ以上の処理でもかまいません。
③で、①のForまでプログラムの流れが戻ります。
(②で行った処理は取り消されたりしません)
①の右端にある「Step 増加数」を①で初期化した整数型変数に足します。
①で初期化した整数型変数が、Toの後ろの「反復処理回数-(変数の初期値-1)」の数に達しているか調べます。
達していれば、③(Nextの行)の次の行にプログラムが移動します。
達していなければ、①の下にある②の処理を行い、③のNextまで処理したら、①のForの行に戻り、長整数型の整数に「Step 増加数」を足してから「反復処理回数-(変数の初期値-1)」に達しているか調べる、ということを達するまで繰り返します。
少し分かり難いと思いますので、次の意訳した構文を見てください。
For 整数型変数 = 反復処理の開始行(列) To 反復処理の終了行(列) Step 増加数
繰り返したい処理
Next 整数型変数
細かいポイントを説明します。
「整数型変数」はなるべく[Long]型(長整数型)の変数を作成してください。
「Step 増加数」は省略可能で、省略すると1が加算されます。通常、省略されます。
「Next」の後ろの『整数型変数』は[For]の後ろの変数を書きます。省略可能ですが、極力記載するようにしましょう。
「繰り返したい処理」の先頭はTabキーを使用して空けてください。空けなくてもエラーは発生しませんが、読みにくくなってしまいます。
Sub Sample_ForNext1()
Dim i as Long '長整数型の変数の作成
For i = 1 To 3 '1~3行目まで繰り返す
Cells(i, 1) = 10 'セルA1~A3に[10]を格納する
Next i
End Sub
「Sample_ForNext1」の実行前は下の画像の状態です。
「Sample_ForNext1」の実行後は下の画像の通りになります。
Cells(i, 1)なので、A列の1~3行目に10を入力することを繰り返してます。
If文と組み合わせる
次のファイルをダウンロードしてください。
ファイル:ForScoreGlaph.xlsx
下記の表が記載されています。
For文等の反復処理は、If文等の他の構文等と組み合わせて力を発揮します。
先ほど、ダウンロードしたファイルに次のマクロをコピペして実行してください。
Sub Sample_ForNext2()
Dim i As Long
For i = 3 To 7
If Cells(i, 4) < 70 Then
Cells(i, 5) = "不合格"
Else
Cells(i, 5) = "合格"
End If
Next i
End Sub
すると、次のようになります。
次の説明はプログラム経験者用なので、次のリンクから確認テストを行ってください。
ページ内リンク:確認テスト
他言語でFor文を学んだ方へ
他の言語を学んだ方には、For文についての説明は不要かと思います。
サンプルに要点を書き足しプログラムを用意しました。
Excel VBA の for文
基本構文です。
For 変数 = 初期値 To 終了値 Step 増加数
繰り返したい処理
Next 変数
ポイントです。
- For文を使用する前に、変数を作成する必要がある。
(理由は後述するが、Long型の使用を推奨) - [Step 増加数]は省略可能(省略時は初期化した変数に+1)。
- Java等の言語であたるFor文開始の「{」は必要ない。
- Nextの後ろの変数は省略可能
- Java等の言語であたるFor文終わりの「}」は必要なく、代わりにNextを記載
使用サンプルです。A1~A10に「Hello World!!」と入力します。
Sub P_SampleFor1()
Dim i as Long '事前に変数作成の必要あり
For i = 1 To 10 '[Step 1]は省略
Cells(i, 1) = "Hello World!!" 'セルA1~A10に文字を代入
Next i 'Nextの後の[i]は省略可能だが、明示を推奨
End Sub
F8でステップインできるので、Excelを確認しつつ試すと良いでしょう。
保存をしてからステップインをしないと、まれに途中で実行に切り替わってしまう不具合が発生してしまうようです。
ステップインするときは保存をしてください。
break の代わりの[Exit For]
C言語やJavaではfor文の途中で脱出する(抜ける)[break]がありました。VBAではそれに該当する「Exit For」が存在します。
Sub P_SampleFor2()
Dim i As Long
For i = 1 To 5
Exit For 'breakの代わりのExit For
MsgBox "Hello World!!"
Next i
End Sub
continue の代わりの[Goto]
C言語やJavaではfor文の途中でループ最後までステップを移動させる[continue]がありました。VBAでは[continue]に当たる文法はありません。代替として「Goto」を使用します。
Sub P_SampleFor3()
Dim i As Long
For i = 1 To 5
If True Then
GoTo ExGo 'continueの代わりのGoto
End If
MsgBox "Hello World!!"
ExGo: '上記Gotoの移動先(Nextの直前に設置する)
Next i
End Sub
Long型のススメ
Forで使用する変数を「long型」で宣言しているのは理由があります。
Java/C言語のint型に相当するInteger型の範囲は「-32,768 ~ 32,767」です。
Excel(xlsx形式)は、1,048,576行と16,384列のセルで形成されています。
処理対象の表が40,000行あると仮定すると、32,768行目で変数iに32,768を代入しようとした時、上限を超えているためにオーバーフローが発生します。
Long型の範囲は「-2,147,483,648 ~ 2,147,483,647」です。
(詳細はコチラ)
最下行の1,048,576行でも、余裕をもってデータを格納することができます。
慣れないうちは抵抗があるかもしれませんが、メモリはケチらずにLong型で宣言すると良いでしょう。
確認テスト
For文を使い、次の問いに答えなさい。
-
セルA10~A13に「Hello」と入力しなさい。
【解答例1】
Sub TestForNext1_1() 'Forで使用する変数iを作成 Dim i As Long 'i(初期値10)が10~13の間、繰り返す For i = 10 To 13 Step 1 'i(10~13)行目に"Hello"と入力 Cells(i, 1) = "Hello" Next i End Sub
【解答例2】
Sub TestForNext1_2() 'Forで使用する変数iを作成 Dim i As Long 'i(初期値10)が10~13の間、繰り返す For i = 10 To 13 Cells(i, 1) = "Hello" Next End Sub
【解答例3】
Sub TestForNext1_3() 'Forで使用する変数iを作成 Dim i As Long 'i(初期値10)が10~13の間、繰り返す For i = 10 To 13 Cells(i, 1) = "Hello" Next i End Sub
【解説】
解答例1では[Step 増加数]と[Next 変数]を省略せず、解答例2ではそれらの省略をしています。 解答例3のように、[Step 増加数]を省略して[Next 変数]を省略せず書くこともできます。
-
セルA1~D5に「hoge」と入力しなさい。
【解答例1】
Sub TestForNext3_1() Dim i As Long Dim j As Long 'j列目の1~5行が対象 For i = 1 To 5 'i行目の1~4列が対象 For j = 1 To 4 Cells(i, j) = "hoge" Next j Next i End Sub
【解答例2】
Sub TestForNext3_2() Dim i As Long Dim j As Long 'j行目の1~4行が対象 For i = 1 To 4 'i列目の1~5行が対象 For j = 1 To 5 Cells(j, i) = "hoge" Next j Next i End Sub
【解説】
A1~D4と縦横の両方で処理を行う場合は解答例のようにFor文の中にFor文を処理させる必要があります。【解答例1】と【解答例2】は実行完了後は同じになりますが、プロセスが異なります。
●【解答例1】
「『横に4回入力する処理』を縦にも5回処理させる」という考え方です。A1~D1に「hoge」を入力して、次にA2~D2に入力、次にA3~D3、A4~D4、最後にA5~D5に入力します。
つまり、縦4セルに5回入力することを繰り返します。
●【解答例2】
「『縦に5回入力する処理』を横にも4回処理させる」という考え方です。A1~A5に「hoge」を入力して、次にB1~B5に入力、次にC1~C5、最後にD1~D5に入力します。
つまり、横5セルに4回入力することを繰り返します。