VBAのGoSubで同じプロシージャ内でサブルーチンを呼び出す方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

GoSubの概要

プロシージャ内の特定の位置へジャンプし、処理を実行した後に戻る VBAの予約語

GoSub

概要 GoSub ステートメントは、VBAでプロシージャ内の指定したラベルへジャンプし、処理を実行した後、元の位置に戻るために使用されます。ただし、現在のVBAでは 推奨されていない古い制御構造 であり、代わりに SubFunction を使用することが推奨されます。

わかりやすく説明 プロシージャの中で一時的に別の処理にジャンプし、処理後に元の位置に戻る命令。

  • 現在のプロシージャ内のラベル(ラベル:)へジャンプし、処理を実行する。
  • Return を使うことで、元の場所へ戻る。
  • 古いVBAのコードで見られるが、現在は SubFunction を使用する方が良い。

GoSubを使った基本的なサブルーチンの呼び出し

以下の例では、GoSub を使ってサブルーチンへジャンプし、処理後に元の位置へ戻ります。

Sub TestGoSub()
    Dim num As Integer
    num = 5

    GoSub CalculateSquare
    MsgBox "計算結果: " & num
    Exit Sub ' GoSubを使う場合は明示的にExit Subを入れる

CalculateSquare:
    num = num * num
    Return
End Sub

解説:

  • GoSub CalculateSquare: CalculateSquare: の位置へジャンプ。
  • Return: GoSub が呼ばれた次の行に戻る。
  • Exit Sub: もし Return ではなく直接 Exit Sub に到達した場合、エラーを防ぐ。

GoSubの問題点とSub/Functionを使った代替

GoSub はコードの可読性を低下させるため、Sub や Function を使用する方が良いです。

' GoSubを使わずにSubで代替
Sub TestSub()
    Dim num As Integer
    num = 5
    num = CalculateSquare(num)
    MsgBox "計算結果: " & num
End Sub

Function CalculateSquare(n As Integer) As Integer
    CalculateSquare = n * n
End Function

解説:

  • Function を使って、GoSub の代わりに再利用可能な処理を定義。
  • 可読性が向上し、コードの保守性が高まる。

Excel VBAでのGoSubの活用例(非推奨)

以下の例では、Excelのセルの値を変更するためにGoSubを使っています。

Sub UpdateCell()
    Range("A1").Value = 10
    GoSub DoubleValue
    MsgBox "A1の新しい値: " & Range("A1").Value
    Exit Sub

DoubleValue:
    Range("A1").Value = Range("A1").Value * 2
    Return
End Sub

解説:

  • GoSub DoubleValue により、セルの値を2倍にする処理へジャンプ。
  • ただし、この処理も Sub に分離する方が適切。

GoSubの注意事項

  • 現在のVBAでは非推奨: SubFunction を使うのが推奨される。
  • Returnを忘れるとエラーになる: GoSub のジャンプ先には必ず Return を記述する。
  • Exit Subを使わないと制御が不明確になる: プロシージャの終了時には明示的に Exit Sub を書く。

よくある質問

Q: GoSub を使うべき場面はありますか?
A: いいえ。現在のVBAでは、Sub や Function を使う方が適切です。
Q: GoSub の代わりに何を使えばよいですか?
A: Sub または Function を使い、処理を明確に分離するのがベストです。
Q: GoSub を使うとエラーになることがありますか?
A: はい。Return がないと「Return なしの GoSub」で実行時エラーが発生します。

まとめ

  • GoSub はプロシージャ内の特定の位置にジャンプし、処理後に元の位置へ戻る。
  • 現在のVBAでは非推奨であり、Sub や Function を使うのが推奨される。
  • GoSub を使う場合は、Return を必ず記述する必要がある。
  • Excel VBAの処理でも Sub や Function に分離することで可読性が向上する。