ループ処理とは!?
ループ処理とは何かというと…そのままですね。繰り返し処理の事です。
ある一定の条件の元、繰り返し処理を行うとプログラムそのものも楽になりますし修正したいときなどにも修正は一部分だけで済む。などのメリットがあります。
例えばこのような時にループ処理を使うと処理が楽になります。
これは単純に例ではありますが、規則的なルールがあるものを他の列などに移したい時等にループ処理が非常に役に立ちます。
ループ処理には種類があります。
- For Each … オブジェクトと呼ばれる物に対して処理を行います。簡単な例ではRangeを順番に見て行って処理を行う事が出来ます。
- For Next … カウンタ変数といわれるものを準備してカウンタ変数が条件を満たすまで繰り返し処理を行います。
- Do Loop … 終了条件を満たすまで永遠に回り続けます。終了条件を指定しなければ無限ループにハマってしまいます。
本当はまだ種類があるのですが、一般的に使われるのはこの3種類です。説明では難しいので実際に記述してやってみましょう。
For Eachを使用した場合
Dim v As Range For Each v In Range(Cells(1, 1), Cells(10, 1)) v.Offset(0, 3).Value = v Next
今回触れるのは初めてですが、vという変数を準備してvという変数はRangeにしか使用しません。という風に宣言します。
For Eachに続いてv Inとする事によりvの中にRangeを入れます。
Rangeに入れる範囲(他のセルに移したい値が入っている)はCells(1, 1)からCells(10, 1)の範囲ですね。
値を移したいのはD列なのでoffset関数を使って右3つ分ずらした所にvの値を入れていきます。
For Eachの場合はNextを通って次のループに入る度にvは別のRangeに移っていきます。
For Nextを使用した場合
Dim i As Integer For i = 1 To 10 Cells(i, 1).Value = Cells(i, 4).Value Next
整数型(Integer)で宣言したiという変数が今回カウンタ変数として準備した変数です。
For i = 1 To 10とすることにより、iはループする度に1~10まで1ずつ増えていきます。iが10まで到達して11になる前に処理を抜けます。
今回行いたい処理はA列の値をD列に移したいだけなので列は1列目→4列目が必ず固定されるルールです。変わるのは行だけなのでその行をiという変化するカウンタ変数で指定する事により転記する場所を変化させています。
Do Loopを使用する場合
Dim i As Integer i = 1 Do If i > 10 Then Exit Do Cells(i, 1).Value = Cells(i, 4).Value i = i + 1 Loop
Forの様にカウンタ変数は準備したのですが、Do Loopの場合はカウンタ変数という概念がありません。という事で次のループに入る前にカウンタ変数を1ずつ足しています(自分自身に1を足す事により自分自身を1ずつ増やしています)。
また、If文でiが10よりも大きくなったらExit Doとする事によりiが10よりも大きくなったらDo Loopを抜けるようにしてあります。
余談ですが、If文はこの様に単純なものであれば1行で書ききることもできます。
実際の処理の部分についてはFor Nextと同じことをしています。
Do Loopの場合はこのIf i > 10 Then Exit DoのようなDoを抜ける処理が記述されていなければ無限ループに入りご自身のパソコンが永遠と考え続けてフリーズしてしまう原因となりますのでお気をつけください。僕の場合は無限ループに入らないようにカウンタ変数を足す処理と処理を抜ける条件を必ず先に書いてから実際の処理を書いていくようにしています。
今回は少し長くなってしまいましたが、次回はFor Nextなどをもっと汎用性高く使用できる様に必要なものをお勉強していきましょう。