【VBA入門】GoToでスキップ(ラベル、ループ制御、エラー処理)

GoToステートメントって使ってますか?GoToステートメントは所定の記述まで処理をジャンプさせることができます。

この記事では、GoToステートメントについて

  • GoToとは
  • ラベルへジャンプする方法
  • という基本的な内容から、

  • ループをスキップする方法
  • On Error GoToでエラー処理をする方法
  • など応用的な内容についても解説していきます。

    今回はGoToステートメントについて、使い方をわかりやすく解説します!

    目次

    GoToステートメントとは

    GoToステートメントはラベル先へ処理をジャンプさせます。ループ処理内である条件では処理をスキップしたい場合や、エラー処理を行いたい場合などで使われます。

    ラベル先は同じプロシージャ内だけで、他のプロシージャへジャンプさせることはできません。

    必要以上にGoToステートメントを多用すると、コードのフローが複雑になり読みにくくなりバグが発生する原因にもなりますので注意しましょう!

    ラベルへジャンプする方法

    GoToステートメントは以下のように記述して使用します。

    GoTo ラベル名
        処理1
    ラベル名:
        処理2

    この場合GoToステートメントでラベル先の処理2は実行されますが、処理1は実行されません

    それではサンプルコードで確認していきましょう。

    Sub macro1()
        Dim point As Integer
        
        point = 70
        
        If False Then
        ElseIf point > 80 Then GoTo L1
        ElseIf point > 60 Then GoTo L2
        ElseIf point > 40 Then GoTo L3
        Else: GoTo L4
        End If
        
    L1:
        MsgBox "優です"
        Exit Sub
    L2:
        MsgBox "良です"
        Exit Sub
    L3:
        MsgBox "可です"
        Exit Sub
    L4:
        MsgBox "不可です"
        Exit Sub
    End Sub

    実行結果:
    GoTo01

    このサンプルコードでは、ElseIfステートメントでの記述を1行に省略し、処理の記述はGoToステートメントのラベル先にまとめています。

    ループをスキップする方法

    ループ処理では、ある条件の場合はそれ以降の処理を省略してループ内の先頭の記述にスキップしたい場合があります。

    そんな場合にVBAでは、continue文は使いません。GoToステートメントを使用します。

    サンプルコードで確認しましょう。

    Sub macro2()
        Dim i As Integer, sum As Integer
        
        For i = 2 To 10
    L1:
            If Not IsNumeric(Range("B" & i)) Then
                i = i + 1
                GoTo L1
            End If
            
            sum = sum + Range("B" & i)
        Next i
        
        MsgBox "合計点数は" & sum & "点です"
    End Sub

    実行結果:
    GoTo02

    このサンプルコードでは、Excelシートのセルに入力されている点数の合計を求めています。

    セルに数値以外の値が入力されている場合は、GoToステートメントを使って合計を算出する処理をスキップして、For文内の最初にあるラベルL1にジャンプしています。

    For Next文でループをスキップする方法については、こちらで詳しく解説していますので、ぜひ参考にしてください。

    On Error GoToでエラー処理をする方法

    On Errorステートメントを使用し処理中にエラーが発生した場合は、GoToステートメントでラベル先のエラー処理へジャンプします。

    サンプルコードで確認していきましょう。

    Sub macro3()
        On Error GoTo ErrLabel
        Dim ErrMsg As String
        
        Dim num1 As Integer, num2 As Integer, result As Double
        
        num1 = 1
        num2 = 0
        result = num1 / num2 'エラー発生
        
        MsgBox ErrMsg & "処理完了"
        
        Exit Sub
          
    ErrLabel:
        ErrMsg = ErrMsg & "エラー番号" & Err.Number & vbCrLf & _
                    "エラー内容" & Err.Description & vbCrLf
        Resume Next 'エラーが発生した次のステートメントから プログラムを継続
    End Sub

    実行結果:
    GoTo03

    このサンプルプログラムでは、意図して0(ゼロ)で除算するエラーを発生させています。On Errorステートメントを使用し、GoToステートメントによりラベルErrLabelのエラー処理の記述までジャンプしています。

    なおResume Nextステートメントを使うと、エラーの発生によってプログラムが中断することなくエラーが発生した次のステートメントから処理を継続することができます。

    エラーを処理する方法については、こちらで詳しく解説していますので、ぜひ参考にしてください。

    まとめ

    ここでは、GoToステートメントについて説明しました。GoToステートメントはラベル先に処理をジャンプさせることができるので便利ですが、多用するとコードが読みにくくなる原因になります。

    ループで処理をスキップする場合やOn Error GoToでエラー処理を行う場合など、用途を限定して使用することをオススメします。

    使いこなすことができるように、この記事を何度も参考にして下さいね!

    この記事を書いた人

    熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
    お問合せはこちらでも受け付けています。
    info@sss-lab.com

    目次