Excel VBA

In Excel VBA, "End" is a keyword that properly concludes blocks such as Sub, Function, and If statements, while also serving as a special command that forcibly terminates VBA execution when used on its own.

End [keyword]

Excel VBAを学習する際、「End」の使い方や種類は意外と奥が深いものです。単にプロシージャの終了を示すだけでなく、制御構文やプログラムの強制終了など、さまざまなシーンで利用されます。

「End」ステートメントとは?

End」ステートメントは、主にVBAの構文を終了させるために用いられます。たとえば、プロシージャ(SubFunction)やIf文、Select文などを正しく閉じるために使われるキーワードです。文法的に正しいVBAコードを書くためには欠かせない要素で、以下のような使い分けがあります。

初心者の方は、どこにどの「End」が対応しているのかを理解するだけでも、VBAのコードを読みやすく・書きやすくなります。一方、中級者以上の方は、単独の End が強制終了の動作をすることを踏まえ、デバッグやエラー制御と絡めて運用する場面もあるでしょう。

さまざまな「End」キーワードの種類

ここでは、VBAで使用される代表的な「End」に関するキーワードを、それぞれの特徴と共に解説します。

End Sub

概要
Sub ~ End Sub のように、Subプロシージャの開始と終了を示すキーワードです。
使用例

VBA

Sub SampleProcedure()
	' ここに処理を書く
End Sub
ポイント
Sub ブロックを正しく閉じなければコンパイルエラーとなるため、必ず対応する End Sub が必要です。
Exit Sub を途中で使用する場合は、処理がそこで抜けて終了しますが、Exit Sub で終了しても最後の行に End Sub は必ず存在しなければなりません。

End Function

概要
Function ~ End Function のように、Functionプロシージャの開始と終了を示すキーワードです。
使用例

VBA

Function SumValue(a As Long, b As Long) As Long
	SumValue = a + b
End Function
ポイント
関数として呼び出す場合に必要です。
関数の戻り値を設定する際は、関数名に値を代入し、最後の End Function で終了させます。
途中で処理を抜けたい場合は Exit Function を使用することができますが、やはり対応する End Function は必須です。

End Property

概要
クラスモジュールなどで使用する Propertyプロシージャを終了させるためのステートメントです。
使用例

VBA

' クラスモジュール内の例
Private pValue As Long

Public Property Get Value() As Long
	Value = pValue
End Property

Public Property Let Value(ByVal newValue As Long)
	pValue = newValue
End Property
ポイント
Property GetProperty LetProperty Set などのプロパティアクセサの終了にそれぞれ End Property が必要です。
変数のカプセル化など、オブジェクト指向的にクラスを作る際に重要です。

End If

概要
If文の条件分岐ブロックを終了するために使用されます。
使用例

VBA

If x > 10 Then
	MsgBox "xは10より大きいです"
ElseIf x = 10 Then
	MsgBox "xは10と等しいです"
Else
	MsgBox "xは10より小さいです"
End If
ポイント
1行で書ける簡易的なIf文の場合は、End If は不要(例:If x > 10 Then MsgBox "...")。
複数行にわたるIf文を記述するときは、必ず End If が必要です。

End Select

概要
Select Case構文の終了を示します。
使用例

VBA

Select Case x
	Case 1
		MsgBox "値は1です"
	Case 2
		MsgBox "値は2です"
	Case Else
		MsgBox "その他の値です"
End Select
ポイント
Select Case構文は複数の条件を整理して書く場合に便利です。
Case ~End Select までがワンセットになるため、必ず対応する End Select が必要になります。

End With

概要
Withブロックの終了を示すステートメントです。
使用例

VBA

With Range("A1")
	.Value = "Hello"
	.Font.Bold = True
End With
ポイント
With ~ End With までの間で、. を利用してオブジェクトを簡易的に扱うことができます。
ネストが多くなるコードを見やすくする際に活用されます。

End Type

概要
ユーザー定義型(UDT: User Defined Type)の宣言を終了するためのキーワードです。
使用例

VBA

Type Student
	Name As String
	Score As Long
End Type
ポイント
VBAの標準モジュールやクラスモジュールで使用できます(クラスモジュール内では一般的にはTypeよりクラスを使うほうが多いです)。
構造体のように複数のメンバをまとめて扱いたい場合に便利です。

End Enum

概要
Enum(列挙型)の定義を終了させるステートメントです。
使用例

VBA

Enum ColorType
	Red = 1
	Green = 2
	Blue = 3
End Enum
ポイント
列挙型として定数をわかりやすくまとめる際に使用します。
Type同様、きちんと End Enum を用いてブロックを閉じる必要があります。

単独の End

概要
プログラムの実行を強制終了するVBAのステートメントです。
使用例

VBA

Sub ForceEndExample()
	MsgBox "この後に強制終了します"
	End  ' この行でVBAの実行が強制的に終了する
	MsgBox "ここは実行されません"
End Sub
ポイント
エラーや例外状況などが発生した時にむやみに使うと、クリーンアップ処理などをスキップして終了してしまうため、推奨はされません。
メモリ解放などの処理が行われないケースがあり、VBAの実行状態が不安定になる可能性があります。
通常の処理終了には Exit Sub / Exit Function などを使う方がベターです。
中級者以上の方は、デバッグ用に最終手段として検討する場合がありますが、実運用のコードには可能な限り使用しないほうがよいでしょう。

EndExit の違い

End」キーワードとよく混同されるのが、途中で処理を抜けるための「Exit Sub」「Exit Function」などの Exit ステートメント です。主な違いは次のとおりです。

End
Exit Sub / Exit Function / Exit Property

基本的には「Endを使うのは最終手段」「通常はExitの方を使う」という考え方でOKです。

StopEnd の違い

VBAのコードを記述していると、Stop と呼ばれるステートメントを見かけることがあります。これと「End」との動作の違いも把握しておくと便利です。

Stop
End

デバッグ目的で一時的に実行を止めたいのであれば、Stop を使うのが適切です。一方、強引にでもすべての実行を終了させたい場合は、End を使うことになりますが、やはり多用は避けるべきです。

使い方の注意点・ベストプラクティス

ブロックを正しく閉じる

単独の End は極力使わない

エラー処理や終了処理をきちんと書く

可読性の高いコードを書く

まとめ

以上、Excel VBAの「End」に関連するステートメントを一通り解説しました。「End」は多くの構文のブロック終了を担う大切な要素である一方、単独の End は強制終了機能として特殊な動きをします。初心者の方は「対応するブロックを正しく閉じる」点をまず意識するところから始め、中級者以上の方は「End はなるべく使わず、Exit Sub / Exit Function など他の手法を駆使してエラー制御を行う」ことを心がけましょう。

VBAは柔軟性が高い分だけ、エラーや不安定な動作を招きやすい側面も持ち合わせています。「End」ステートメントの正しい理解と使い方を押さえておくことで、プログラムをより安全かつ効率的に仕上げることができるでしょう。