まさ工房

ExcelVBAとAcessDBを利用した業務支援ツールを作成する工房です

【Excelマクロ・VBA】処理を途中でスキップ(GoTo)するにはどうすればいいの?教えて!

       f:id:m_kbou:20190529133957p:plain

処理を途中でスキップさせたい場合は、GoTo文を使用すると処理を途中で飛ばしてくれます。スキップさせる先は、同プロシージャ内で指定したラベル先となります。具体的な使い方について説明します。

 

【目次】

 

構文

記述方法は、以下の通りとなります。

GoTo文の記述方法

=======================================================================

GoTo[ラベル名]

[ラベル名:]

=======================================================================

[説明]:

[ラベル名]には、スキップさせるラベル名を記述します。[ラベル名:]には、スキップ先のラベル名を記述します。内容を纏めると、「[ラベル名]で指定したラベルに処理をスキップさせて下さい。」との意味になります。

[記述例]:

GoTo 次データ

 

使い方

使い方について、具体的に説明していきます。

基本的な使い方

Select Case文と組み合わせた使い方について説明します。

[画面]:

f:id:m_kbou:20190529134015p:plain

※<実行>ボタンには、以下の記述例サンプルプロシージャが登録されています。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

-------------------------------------------------

Sub サンプル()
    Select Case Range("A2")
        '80以上の場合
        Case Is >= 80
            GoTo 合格
        '60以上80未満の場合
        Case Is > 60
            GoTo 補欠合格
        '上記以外の場合
        Case Else
            GoTo 不合格
    End Select
合格:
    MsgBox "合格"
    Exit Sub
補欠合格:
    MsgBox "補欠合格"
    Exit Sub
不合格:
    MsgBox "不合格"
    Exit Sub
End Sub

-------------------------------------------------

内容は、「A2セルの値が、80以上であれば合格ラベルにスキップして”合格”を、60以上80未満であれば補欠合格ラベルにスキップして”補欠合格”を、60未満であれば不合格ラベルにスキップして”不合格”をMsgBoxに表示して下さい。」との意味になります。

[実行例]:

f:id:m_kbou:20190529134032p:plain

今回はA2セルに入力されている数値が65のため、60以上80未満の条件に一致する事から”補欠合格”が表示されました。

基本的な使い方についての説明は以上です。

 

ループ処理中での使い方 

For~Next文IF文とを組み合わせた使い方について説明します。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

-------------------------------------------------

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    For 番号 = 1 To 5
        '↓処理③
        If (番号 = 3) Then
            GoTo 次データ
        Else
            MsgBox 番号
        End If
次データ:
    Next
End Sub

-------------------------------------------------

処理の流れは以下の通りとなります。

[処理①]:変数の定義をします
Dimによる変数の定義となります。変数名は「番号」となり、入力できる値は「小数を含む数値のみ」となります。
[処理②]:For~Next文の記述となります
[処理①]で指定した変数:番号に1から5の値を順次セットし、処理を5回実行します。実行する中で、変数:番号にセットされた値を MsgBoxで表示させます。但し、変数:番号の値が3の場合は、次データラベルへ処理をスキップさせます。1回目の処理では、変数:番号に1がセットされ、MsgBoxに「1」が表示されます。2回目の処理では、変数:番号に2がセットされ、MsgBoxに「2」が表示されます。3回目の処理では、変数:番号に3がセットされますが、IF文の条件で次データラベルにスキップされてしまうため、MsgBoxは表示されません。4回目の処理では、変数:番号に4がセットされ、MsgBoxに「4」が表示されます。5回目の処理では、変数:番号に5がセットされ、MsgBoxに「5」が表示されます。

[実行例]:

f:id:m_kbou:20190529134051p:plain

f:id:m_kbou:20190529134058p:plain

f:id:m_kbou:20190529134110p:plain

f:id:m_kbou:20190529134118p:plain

ループ処理中での使い方についての説明は以上です。

 

おわりに

GoTo文を多用すると、処理がどこに行っているかが分からなくなります。できるだけ用途を明確にし、限定して使用するように心掛けて下さい。