繰返し処理
VBAの繰返し処理はいくつか種類があります。初心者の方は、いくつも追いかけると混乱しますので、最初は一番汎用的な For 文をマスターする事を心がけましょう。
For Next
For Next文は、汎用的に使える繰返し処理です。
Sub ForTest()
Dim i As Long, total As Long
For i = 1 To 10
total = total + i
Next i
MsgBox "1から10の合計=" & total '55
End Sub
For文は、カウント用の変数を用意します。(ここでは i ですね。)
この変数に、初期値と最後の値を 「初期値 To 最終値」という形で渡します。
繰返しの最後には、Next i としてこの中に繰り返す処理を書いていきます。
ここでは、total という値に i の値を追加しています。
total = total + i という書き方は違和感があるかもしれませんが、ほとんどのプログラム言語では右辺で計算した結果を左辺に代入しますので、最初に total + i が計算され、その結果を total に入れ直しています。
i は 1から10 と渡ってきますので、1から10までの合計値が total に入ります。
For文を抜けた後に total を表示して終了しています。
For文では、Stepを付けることで、カウント変数の増え方を調整できます。
Sub ForTest2()
Dim i As Long, total As Long
For i = 1 To 10 Step 2
total = total + i
Next i
MsgBox "1から10の奇数値の合計=" & total '25
End Sub
この例では、1から1つ飛びに i に値が渡されます。1+3+5+7+9 となり 25 が出力されます。 i = 1 To 10 なのに 10 が実行されないのは、9 の後が 11 となるため 10 より大きくなってしまうためです。
(余力のある人は、一文字変えて偶数の合計を求めてみてください。)
逆循環
Setp の値を -1 とすると逆循環となります。
この時、 i = 10 To 1 と 初期値 > 最終値 でないとFor文は実行されませんので注意してください。
Sub ForTest3()
Dim i As Long, total As String
For i = 10 To 1 Step -1
total = total & i & " "
Next i
MsgBox total '10 9 8 7 6 5 4 3 2 1
End Sub
この例ではわかりやすいように、文字列を追加していくようにしています。
字下げ
これまでの例で気付いた方も多いと思いますが、For文の中はタブキーを押して右にずらして書き始めています。
こうすることで、処理の進み方がわかりやすくなり、ミスを防ぐ効果もありますので、きちんと字下げするように習慣づけましょう。
For Each Next
For Eachはコレクションや配列に対して繰返し処理を行いたい時に使います。コレクションとはオブジェクトの配列のようなものです。
配列の全ての要素に対して1つづつ処理を行うような場合に使います。
構文としては、
For Each 要素 In コレクション(配列)
のように使います。
要素の部分はバリアント型をセットするのが一般的ですが、特定のオブジェクト変数を指定することもあります。
こちらも、定石のようなものがありますので、要素とコレクション(配列)は、サンプルを見て真似るようにした方が失敗は少ないと思います。
Sub ForEachTest()
Dim ws As Worksheet
For Each ws In Worksheets 'ワークシートコレクション
MsgBox ws.Name
Next ws
End Sub
この例では、ワークシートコレクションに対して、要素は Worksheetオブジェクトの型を指定しています。
ここでは、ワークシートの名前を取り出しているだけですが、全てのワークシートに対して何か行いたいときはこのような形になります。
Do Loop
Do Loopの繰返し処理では、While と Until というステータスを挟みます。
Whileは、「~になったら終了」
Untilは、「~になるまで続ける」
という感じです。
さらに、While と Until は条件式を繰返し処理の後ろに置くことができます。
例を見ていきましょう。
Sub DoTest()
Dim i As Long, total As String
i = 1
Do While i <= 10 '10以上になったら終わる
total = total & i & " "
i = i + 1
Loop
MsgBox total '1 2 3 4 5 6 7 8 9 10
End Sub
Sub DoTest2()
Dim i As Long, total As String
i = 1
Do Until i > 10 '10より大きくなるまで続ける
total = total & i & " "
i = i + 1
Loop
MsgBox total '1 2 3 4 5 6 7 8 9 10
End Sub
この例は、While と Until を前に置いているので、まず条件式に適合しているかを判断してから次の処理を行っています。
先程のFor文と同じですね。
While と Until の違いは i に対する不等号の向きが違うところに注目してください。
While と Until が後ろになる例
While と Until を後ろに置いた例です。こうすると繰返し処理の後で条件判断するようになります。
今回の例では結果は同じですが、このようなバリエーションがあると覚えておきましょう。
Sub DoTest3()
Dim i As Long, total As String
i = 1
Do
total = total & i & " "
i = i + 1
Loop While i <= 10 '10以上になったら終わる
MsgBox total '
End Sub
Sub DoTest4()
Dim i As Long, total As String
i = 1
Do
total = total & i & " "
i = i + 1
Loop Until i > 10 '10より大きくなるまで続ける
MsgBox total '1 2 3 4 5 6 7 8 9 10
End Sub
Do Loop の使いどころ
Do Loopは、使い方を間違えると、無限ループとなってしまうことがあり扱いが難しくなります。
Do Loopは、「最後の行まで繰り返す」ような、その時々で変化してしまうかもしれない時に便利です。カウント用の変数を用意する必要がなくなるのでスッキリとしたコードを書くことができます。
Do Loopは、定石のような書き方があるので、そのような使い方を覚えていくのが良いと思います。
ループを抜ける
これまで見てきた繰返し処理は、途中で処理を抜けたい時、Exit For や Exit Do で処理を抜けることができます。
尚、繰返し処理は二重にして入れ子状態にすることができますが、その場合、Exit For や Exit Do は書かれたループの一つ外に出ます。
Sub For2Test()
Dim i As Long, j As Long, total As String
For i = 1 To 3
For j = 1 To 10
If j > 3 Then
Exit For
End If
total = total & i & ":" & j & " "
Next j
Next i
MsgBox total '1:1 1:2 1:3 2:1 2:2 2:3 3:1 3:2 3:3
End Sub
この例では、内側の j が3より大きくなると Exit for で処理を抜けています。
入れ子になっているループの一番外に出たい場合は、次の Goto を使います。
Gotoステートメント
先程のコードを Goto に変更してみました。
Goto では、行先をラベルで指定します。ラベル名は自分で決めることができますが、行の先頭から書き始め、最後に :(コロン)で終わらなければいけません。
またラベル名の途中で空白を入れてはいけません。
Sub For2Test2()
Dim i As Long, j As Long, total As String
For i = 1 To 3
For j = 1 To 10
If j > 3 Then
GoTo LABEL
End If
total = total & i & ":" & j & " "
Next j
Next i
LABEL:
MsgBox total '1:1 1:2 1:3
End Sub
Goto はエラー処理などでメッセージを出して処理を終わらせたい時などによく使用されます。
(☞゚ヮ゚)☞ 次は 条件分岐 について学びましょう!