For文の動きを制御する方法についてご説明します。
For文は設定した変数が初期値の状態からToで設定した値になるまで同じ処理を繰り返し実行しますが、
状況によっては処理を実行せずにループ処理を続行してほしい場合もあります。
そんな時はgotoでFor文の動きを制御することができます。
Gotoの構文
ラベル名: ~処理A Goto ラベル名 ~処理B
<解説>
まずは処理を移動したい箇所にラベルを作成します。
ラベルは任意の文字列の後ろにコロン(:)を記述するだけで設定できます。
そしてコード内の任意の個所に「goto ラベル名」と記述するとそこからラベルへ処理が移動します。
上の例では処理Aが実行された後にgotoでラベルへ戻るので
処理Aが繰り返し実行され、処理Bが実行されない状態になります。
また、ラベルの場所はgotoより前でも後でも自由に設定可能です。
Forとgotoを組み合わせたループ処理の制御
<コード>
Dim i As Integer Dim Goukei As Integer '合計金額を格納' Goukei = 0 For i = 3 To 8 GoukeiStop: 'ラベルGoukeiStopを設定' If Not IsNumeric(Range("C" & i)) Then '該当するセルが数値ではない場合' i = i + 1 'ループのカウンタを加算' GoTo GoukeiStop 'ループの先頭に戻る' End If Goukei = Goukei + Range("C" & i) Next i MsgBox "合計金額は" & Goukei & "円です"
<実行例>
例では金額に数値が入っていない場合は処理がFor文の先頭のラベルGoukeiStopに戻っていますが、
ループ処理はC8セルまで継続して行われています。またgoto文でラベルへ移動する前にカウンタiを加算しないと
無限ループになってしまうので注意してください。
ラベルをfor文の最後に設定したパターン
<コード>
Dim i As Integer Dim Tanka As Integer '単価を設定' For i = 3 To 8 If Not IsNumeric(Range("C" & i)) Then GoTo ZeikomiInputNext 'ループの終端へ移動' End If Tanka = Range("C" & i) Range("D" & i) = Tanka * 1.08 '税込み金額を入力' ZeikomiInputNext: Next i
<実行例>
こちらはgotoの後にラベルを設定したパターンです。
単価が入力されたC列のセルを順番にチェックし、数値が入力されている場合のみD列に税込み金額を入力しています。
またラベルZeikomiInputNextへ移動後はNextでカウンタiが加算されているため、カウンタを加算するコードは記述不要です。
goto使用時の注意点
gotoはラベルを設定すればコード内の任意の個所へ処理を移動させることができ、自由度が高い反面
コードの流れが分かりにくくなってしまうという危険性があります。
先の例ではgotoを使わずにif文で同じ動作をするコードを記述することも可能です。
むやみにgotoやラベルを多用することは避け、コード全体の構成が分かりやすくなるようにしましょう。
おわりに
For文のループ処理はgotoとラベルを使用することにより制御することができます。
単純な繰り返し処理だけでは実現できなかった機能を組み込むことが可能となるので
より柔軟にコードを設計することができるようになりますね。