VBAのSelect Case文を使っていると、「この条件に該当した場合だけは何も処理したくない」という場面があります。
たとえば、ステータスが「処理済」のデータは変更せず、それ以外のデータだけ更新したいケースです。
しかし、VBAには「何もしない」ことを直接表す専用命令があるわけではありません。そのため、空のCaseを記述する、対象外の条件を先に分岐する、処理を別のプロシージャへ分けるなど、目的に応じた設計が必要です。
この記事では、Select Case文で何もしない条件を作る基本から、ループ内で処理をスキップする方法、Case Elseとの違い、保守しやすい実務向けコードまで解説します。
✅ Select Case文で何もしない条件は作れる
Select Case文では、条件に該当するCaseの下へ処理を書かなければ、実質的に何もしない状態を作れます。
基本的な構文は次のとおりです。
Select Case 判定する値
Case 条件1
処理1
Case 条件2
' 何もしない
Case Else
その他の処理
End Select
条件2に該当した場合は、実行する命令がないため、そのままEnd Selectの後へ進みます。
ただし、空欄のままにすると「処理の書き忘れなのか、意図的に何もしないのか」が分かりにくくなります。
実務では、次のようにコメントを残すことが重要です。
Case "処理済"
' 処理済みのデータは変更しない
このコメントがあるだけで、後からコードを読んだ人が設計意図を判断しやすくなります。
✅ 空のCaseを使って処理をスキップする方法
たとえば、セルに入力されたステータスに応じて処理を分ける場合を考えます。
- 未処理:処理を実行する
- 処理中:確認メッセージを表示する
- 処理済:何もしない
- その他:入力内容を確認する
この場合は、次のように記述できます。
・意図が伝わるコメントを残して空のCaseを使う
Sub ProcessByStatus()
Dim targetWorksheet As Worksheet
Dim currentStatus As String
Set targetWorksheet = ThisWorkbook.Worksheets("進捗管理")
currentStatus = Trim$(CStr(targetWorksheet.Range("B2").Value))
Select Case currentStatus
Case "未処理"
targetWorksheet.Range("C2").Value = "処理を開始しました"
Case "処理中"
MsgBox "現在処理中のデータです。", vbInformation
Case "処理済"
' 処理済みのデータは変更しない
Case Else
MsgBox "ステータスの入力内容を確認してください。", vbExclamation
End Select
End Sub
このコードでは、判定前にTrim$を使って前後の不要なスペースを取り除いています。
また、セルの値をCStrで文字列へ変換してから判定しているため、値の取得と条件分岐の役割が明確です。
「処理済」のCaseには命令を書いていませんが、コメントによって意図的に何もしないことが分かります。
・空欄よりコメントを残す方が安全な理由
次のように、完全な空欄として記述しても構文上は問題ありません。
Case "処理済"
Case Else
しかし、この書き方では、処理の追加を忘れたようにも見えます。
コードを書いた本人は分かっていても、数か月後に修正するときや、別の担当者が引き継ぐときには判断できない可能性があります。
実務では、処理を省略した理由までコメントで示しましょう。
Case "処理済"
' 再処理による二重更新を防ぐため、何も行わない
単に「何もしない」と書くよりも、何もしない理由まで残すと、仕様変更時にも判断しやすくなります。
今回のサンプルでも使用しているTrimは、前後の不要なスペースを取り除き、条件判定の精度を高めるためによく利用されます。TrimとReplaceの使い分けについて詳しく知りたい方は、【VBA】スペースを一括削除する方法|Replace関数・Trim関数の使い分けと実務活用も参考にしてください。
✅ Case Elseで何もしない書き方
指定した条件以外をすべて無視したい場合は、Case Elseで何もしない構成も使えます。
Select Case currentStatus
Case "未処理"
Call StartProcess
Case "処理中"
Call ShowProcessingMessage
Case Else
' 上記以外のステータスは処理対象外
End Select
この書き方では、「未処理」と「処理中」だけが処理対象です。
「処理済」「保留」「取消」など、その他の値に該当した場合は何も実行されません。
ただし、想定していない入力ミスまで無視してしまう点には注意が必要です。
たとえば、「未処理」を「未処里」と誤入力しても、Case Elseで何もせず終了するため、問題に気づけない可能性があります。
入力値が決められた候補から選択される場合は問題ありませんが、手入力される場合はエラーメッセージを表示する方が安全です。
今回は「何もしない条件」を中心に解説しましたが、文字列ごとの分岐方法や大文字・小文字の扱いなど、Select Caseの基本的な使い方については、【VBA】Select Case文で文字列を比較する方法|実務で使える条件分岐の基本で詳しく解説しています。
✅ 複数の条件で何もしない場合のまとめ方
複数の値を同じ扱いにする場合は、1つのCaseへカンマ区切りでまとめられます。
Select Case currentStatus
Case "処理済", "取消", "対象外"
' 更新対象ではないため何もしない
Case "未処理"
Call StartProcess
Case Else
MsgBox "未登録のステータスです。", vbExclamation
End Select
次のように同じ内容を何度も書く必要はありません。
Case "処理済"
' 何もしない
Case "取消"
' 何もしない
Case "対象外"
' 何もしない
同じ結果になる条件は、1つのCaseへまとめた方が、条件の追加や削除を行いやすくなります。
ただし、条件ごとに「何もしない理由」が異なる場合は、無理にまとめない方が分かりやすいこともあります。
コードの短さよりも、条件の意味が伝わる構成を優先しましょう。
「○○かつ△△」のように複数条件で処理を分けたい場合は、AND条件を組み合わせた設計が必要になります。複数条件を整理する方法は、【VBA】Select Case文でAND条件を使う方法|複数条件を見やすく分岐する実務テクニックで詳しく紹介しています。
✅ ループ内で特定の条件だけ処理しない方法
一覧表を1行ずつ処理しているときに、特定のステータスだけスキップしたいこともあります。
たとえば、「処理済」の行は変更せず、「未処理」の行だけ更新するケースです。
・Select Caseの後に共通処理がある場合は注意する
次のコードでは、Case "処理済"を空にしても、End Selectの後にある共通処理は実行されます。
Select Case currentStatus
Case "処理済"
' ここでは何もしない
Case "未処理"
targetCell.Value = "処理開始"
End Select
targetWorksheet.Cells(currentRow, "D").Value = Now
「処理済」の行であっても、D列への日時入力は実行されます。
つまり、空のCaseがスキップするのは、Select Case文の中にある処理だけです。ループの残りすべてを飛ばすわけではありません。
VBAには、他の言語で使われるContinue Forが利用できない環境もあるため、実務では「処理する条件だけを書く」構成が安全です。
・対象条件だけ本処理を呼び出す構成にする
Option Explicit
Private Const STATUS_COLUMN As String = "B"
Private Const RESULT_COLUMN As String = "C"
Private Const FIRST_DATA_ROW As Long = 2
Public Sub ProcessStatusList()
Dim targetWorksheet As Worksheet
Dim lastRow As Long
Dim currentRow As Long
Dim currentStatus As String
Set targetWorksheet = ThisWorkbook.Worksheets("進捗管理")
lastRow = targetWorksheet.Cells( _
targetWorksheet.Rows.Count, STATUS_COLUMN _
).End(xlUp).Row
If lastRow < FIRST_DATA_ROW Then Exit Sub
For currentRow = FIRST_DATA_ROW To lastRow
currentStatus = Trim$(CStr( _
targetWorksheet.Cells(currentRow, STATUS_COLUMN).Value _
))
Select Case currentStatus
Case "未処理"
ProcessTargetRow targetWorksheet, currentRow
Case "処理済", "取消", "対象外"
' 更新対象外のため、この行には何も行わない
Case Else
WriteStatusError targetWorksheet, currentRow
End Select
Next currentRow
End Sub
Private Sub ProcessTargetRow( _
ByVal targetWorksheet As Worksheet, _
ByVal targetRow As Long _
)
targetWorksheet.Cells(targetRow, RESULT_COLUMN).Value = "処理完了"
End Sub
Private Sub WriteStatusError( _
ByVal targetWorksheet As Worksheet, _
ByVal targetRow As Long _
)
targetWorksheet.Cells(targetRow, RESULT_COLUMN).Value = _
"ステータス要確認"
End Sub
・処理する条件を明示すると事故を防ぎやすい
このコードでは、「対象外の行をどう飛ばすか」ではなく、「どの条件なら処理するか」を明示しています。
実際の更新処理はProcessTargetRowへ分けているため、Select Case文には条件分岐だけが残ります。
すべてを1つのSubへ書く方法と比べて、次のメリットがあります。
- 条件分岐と更新処理を分けて確認できる
- 処理済みデータの二重更新を防ぎやすい
- 更新内容が変わっても分岐部分への影響が少ない
- エラー行の扱いを個別に変更できる
- 別の一覧表でも更新処理を流用しやすい
実務では、何もしない条件よりも「処理してよい条件」を明確にする方が、安全な設計になることがあります。
実務では、ステータスだけでなく担当者や日付など、複数の項目を組み合わせて判定することも少なくありません。複数の変数を使った条件分岐については、【VBA】Select Case文で複数の変数を判定する方法|実務で使える条件分岐の書き方も参考になります。
✅ Exit Subを使って処理全体を終了する方法
特定の条件に該当した時点で、そのプロシージャの処理をすべて終了したい場合は、Exit Subを使います。
Sub UpdateRecord()
Dim targetWorksheet As Worksheet
Dim currentStatus As String
Set targetWorksheet = ThisWorkbook.Worksheets("進捗管理")
currentStatus = Trim$(CStr(targetWorksheet.Range("B2").Value))
Select Case currentStatus
Case "処理済", "取消"
' 更新対象外のため、このプロシージャを終了する
Exit Sub
Case "未処理"
' 後続処理を継続する
Case Else
MsgBox "ステータスを確認してください。", vbExclamation
Exit Sub
End Select
targetWorksheet.Range("C2").Value = "更新完了"
targetWorksheet.Range("D2").Value = Now
End Sub
空のCaseでは、Select Case文の後にある処理が実行されます。
一方、Exit Subを使うと、そのSub自体を終了するため、後続処理も実行されません。
使い分けは次のとおりです。
| 方法 | 動作 |
|---|---|
| 空のCase | Case内では何もせず、End Selectの後へ進む |
| Exit Sub | 現在のSubを終了し、後続処理も行わない |
| Case Elseを空にする | 指定条件以外を無視して後続処理へ進む |
| 処理対象だけCaseに書く | 該当する条件だけ個別処理を実行する |
Exit Subは便利ですが、プロシージャの途中に増えすぎると、どこで処理が終了するのか追いにくくなります。
入力値の検証や対象外データの除外など、早い段階で処理を終了する場面に絞って使うと分かりやすくなります。
空のCaseは「Select Case文の中だけ」を何もしない構成ですが、プロシージャ全体を終了したい場合はExit Subを使います。Exit Subの使い分けや実務での設計については、【VBA】Exit Subの基本~実用的な使い方|処理制御と安全なマクロ設計を完全解説で詳しく解説しています。
✅ GoToでループをスキップする方法は慎重に使う
ループの途中から次の行へ進むために、GoToを使うコードもあります。
For currentRow = 2 To lastRow
Select Case targetWorksheet.Cells(currentRow, "B").Value
Case "処理済"
GoTo ContinueLoop
Case "未処理"
targetWorksheet.Cells(currentRow, "C").Value = "処理完了"
End Select
ContinueLoop:
Next currentRow
この方法でも動作しますが、ジャンプ先が増えると処理の流れを追いにくくなります。
単純なループで1か所だけスキップする場合は使えますが、条件が増える可能性があるコードでは、対象条件だけ処理する構成や、処理を別プロシージャへ分ける方法がおすすめです。
GoToを完全に禁止する必要はありませんが、「なぜジャンプが必要なのか」を説明できる場合に限定すると、保守性を損ないにくくなります。
GoToは便利な反面、ジャンプ先が増えるとコードの流れを追いにくくなることがあります。安全な使い方や避けるべきケースについては、【VBA】GoToステートメントの理解と使用方法|誤用を防ぎ安全に制御する実務判断で詳しく解説しています。
✅ 何もしない条件を使うときの注意点
Select Case文で何もしない条件を作る場合は、次の点に注意しましょう。
・意図的な空処理にはコメントを付ける
処理の書き忘れと区別するため、理由が分かるコメントを残します。
Case "処理済"
' 二重更新を防ぐため、処理しない
・後続処理が実行されるか確認する
空のCaseでは、End Selectの後にある処理は実行されます。
後続処理も止めたい場合は、Exit Subなどを検討します。
・Case Elseで入力ミスを見逃さない
Case Elseを空にすると、想定外の値も無視されます。
手入力される項目では、警告表示やエラー記録を行う方が安全です。
・表記ゆれを判定前に整える
「処理済」と「処理済 」のように末尾へ空白があると、別の文字列として判定されます。
Trim$などで前後の空白を取り除いてから比較すると、表記ゆれによる判定ミスを減らせます。
・処理対象と対象外のどちらが少ないか考える
対象外が1種類だけなら、空のCaseを作る方法でも分かりやすくなります。
一方、対象外が多く、実際に処理する条件が少ない場合は、処理対象だけをCaseへ書く方が簡潔です。
条件数だけでなく、将来どの条件が増えそうかも考えて設計しましょう。
VBAでは、Exit Sub以外にもExit FunctionやExit Forなど、さまざまな終了方法があります。処理を途中で終了させる方法を整理したい方は、【VBA】処理を止める「Exit」の使い方|Sub・Function・ループでの中断方法を解説も参考にしてください。
✅ まとめ
VBAのSelect Case文では、Caseの中に処理を書かないことで、特定条件に該当しても何もしない構成を作れます。
ただし、実務では単に空欄にするのではなく、意図的に処理しない理由をコメントで明示することが重要です。
この記事のポイントは次のとおりです。
- 空の
Caseを作ると、その条件では何も実行されない - 意図的な空処理には理由が分かるコメントを付ける
- 複数の対象外条件は、カンマ区切りでまとめられる
Case Elseを空にすると、想定外の値まで見逃す可能性がある- 空の
Caseでも、End Select以降の処理は実行される - 後続処理も止めたい場合は
Exit Subを使う - ループでは、処理する条件だけを明示する設計が安全
- 更新処理を別プロシージャへ分けると保守しやすい
- 判定前に空白や表記ゆれを整える
GoToによるスキップは、処理の流れが複雑にならない範囲で使う
「何もしない」という条件も、業務上は重要な処理ルールです。
処理を書かないだけで終わらせず、「なぜ処理しないのか」「どこから処理を再開するのか」をコード上で明確にしておくと、二重更新や誤処理を防ぎやすくなります。