GoToステートメントでループ処理のcontinueを実装する
EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”GoToステートメントでループ処理のcontinueを実装する”について紹介します!
continue
前回、”Exit For””Exit Do”を使った繰り返し処理の中断について紹介させて頂きました。
他の言語だと、”For文自体の処理を終わらせてしまう処理”とセットで”その処理だけ飛ばす処理の”「continue」があるのですが、VBAにはありません。
専用のものはありませんが、同じことを実装するのは可能です。
GASの記事ですが、continueとの違いの参考になると思います。
GoToステートメント
処理を実装するために、”Go To”ステートメントを利用します。
※同一プロシージャ内で、指定した行に飛ぶことができる。
次のコードを見てください。
EXCELシートのA2セルに数字を入れて、その数字が10以上であれば「10以上の数字です。」、10より小さければ「10より小さい数字です。」とメッセージで表示するプログラムです。
Sub test()
'セルを取得(A2セル)
Dim rng As Range
Set rng = ActiveSheet.Range("A2")
'取得したセルの値が10より小さいかどうかチェック
'10より小さければ、「GoTo」で指定した「tobutokoro」ラベルに行く
If rng.Value < 10 Then GoTo tobutokoro
MsgBox "10以上の数字です。"
Exit Sub 'プロシージャの終了
tobutokoro:
MsgBox "10より小さい数字です。"
End Sub
9行目の「If rng.Value < 10 Then GoTo tobutokoro」でセルの値をチェックしています。10より小さい数字だった場合、「GoTo」で「tobutokoro」のラベルに飛びます。※ラベル名は任意で付けれます。
ラベルは「〇〇:」とラベル名の後ろに「:」コロンを付けます。
注意して欲しいのは、13行目の「Exit Sub」です。「Exit Sub」はプロシージャの処理を終わらせる命令ですが、これがないと今回のケースでは、10以上の数字を入れた場合も、「MsgBox “10より小さい数字です。”」が処理されてしまいます。
実行してみます。
10より小さい数字だった場合、「tobutokoro:」まで飛んでいたのが分かりますね。
continueの処理の実装
“Exit For””Exit Do”での繰り返し処理の中断は次の図のような流れでした。
それと比較して、”continue”の流れは次のようになります。
つまり「continue」になった場合、その後の処理を飛ばして、次の繰り返し処理に進むということになります。
前回、”Exit For””Exit Do”の説明で使ったコードを改造してみます。
A1セルからA10セルまで順に「りんご」かどうかを確認していくコートです。16行目で、セルから取得した値をメッセージで表示し、18行目でりんごかどうかチェックしています。りんごであれば、その行数をメッセージで表示し、「GoTo」で「tobutokoro」ラベルまで飛ぶ。そうでなければ、それ以下の処理で、格納した値とりんごが違うことをメッセージで表示します。
Sub test()
' EXCELシートを取得する
Dim sheet As Worksheet
Set sheet = ThisWorkbook.ActiveSheet
' A1セルからA10セルまで順番にチェック
Dim i As Long
For i = 1 To 10
' チェックするセルの値が”りんご”だったら、メッセージボックスで表示
Dim checkRng As Range
Set checkRng = sheet.Cells(i, 1)
' 格納されたものをメッセージで表示
MsgBox "「" & checkRng.Value & "」が格納されました。"
If checkRng.Value = "りんご" Then
MsgBox "りんごは " & checkRng.Row & "行目です。"
GoTo tobutokoro
End If
' GoToによって飛ばされる処理
MsgBox "りんごは " & checkRng.Value & "とは違います。"
tobutokoro: 'ラベルを「Next」の前に入れる
Next
MsgBox "処理終了"
End Sub
26行目、次の繰り返し処理に進む命令の「Next」の直前にラベルをおいています。これによってGoToからラベルまでの間の処理が飛ばされて、次の繰り返し処理に進むようになりますね。
こちらも動画で見てみましょう。
りんごが見つかったときだけ、以下の処理を飛ばして次の繰り返し処理に進んでいることが分かりましたね。
まとめ
「GoToステートメント」を使ったcontinue処理について説明しました。
とはいえ、GoToを使った処理は推奨されていませんので限られた用途で使うことをオススメしますm(_ _)m
コメント