Excel VBAのSelect Caseが動かない原因とは?シート名で分岐する正しい書き方を解説

Visual Basic

Excel VBAで複数シートを処理する際、シート名によって処理を分岐したいケースは非常によくあります。しかし、Select Caseの書き方を少し間違えるだけで、期待通りに動作しなくなることがあります。

特に初心者の方が混乱しやすいのが、「Case」に条件式を書いてしまうパターンです。この記事では、シート名による分岐処理がうまく動かない原因と、正しいVBAコードの書き方をわかりやすく解説します。

なぜ今回のコードは動かなかったのか

今回のコードでは、以下の部分に問題があります。

Select Case WS_1.Name
 Case WS_1.Name = "Sheet1"
 Case WS_1.Name = "Sheet2"
End Select

Select Caseでは、「Case」に条件式を書くのではなく、比較対象そのものを書く必要があります。

つまり、以下のように記述するのが正しい書き方です。

Select Case WS_1.Name
 Case "Sheet1"
 Case "Sheet2"
End Select

VBA初心者の方が非常によく引っかかるポイントなので、まずはこの違いを覚えておくと理解が深まります。

修正後の正しいコード

今回の目的であれば、以下のように書けば正常に動作します。

Sub Sample()

Dim WS_1 As Worksheet

For Each WS_1 In Worksheets

    If WS_1.Name <> "設定" Then

        Select Case WS_1.Name

            Case "Sheet1"
                WS_1.Range("A1").Value = "Sheet1"

            Case "Sheet2"
                WS_1.Range("A1").Value = "Sheet2"

        End Select

    End If

Next WS_1

End Sub

このコードを実行すると、以下の結果になります。

シート名 A1セル
Sheet1 Sheet1
Sheet2 Sheet2

「Select」や「Activate」を減らすのがVBAの基本

今回のコードには以下のような記述もありました。

WS_1.Select

VBAでは、SelectやActivateを多用すると処理速度低下や誤動作の原因になりやすいため、なるべく直接オブジェクトを指定する書き方が推奨されています。

例えば以下のように、直接セルを書き換える形です。

WS_1.Range("A1").Value = "Sheet1"

この方法ならシートを切り替える必要がなく、高速かつ安定して動作します。

If文だけでも書ける

今回のようなシート数が少ない場合は、Select CaseではなくIf文でも十分です。

If WS_1.Name = "Sheet1" Then
    WS_1.Range("A1") = "Sheet1"
ElseIf WS_1.Name = "Sheet2" Then
    WS_1.Range("A1") = "Sheet2"
End If

シート数が少ない場合は、こちらのほうが読みやすいケースもあります。

さらにシンプルに書く方法

今回の処理内容を見ると、「シート名をA1に書くだけ」なので、実はもっとシンプルにできます。

Sub Sample()

Dim WS_1 As Worksheet

For Each WS_1 In Worksheets

    If WS_1.Name <> "設定" Then
        WS_1.Range("A1").Value = WS_1.Name
    End If

Next WS_1

End Sub

これなら、Sheet1でもSheet2でも、自動的にシート名がA1へ入力されます。

実務では「同じ処理を繰り返す」なら、このように汎用化して書くと保守性が高くなります。

初心者が覚えておくと便利なVBAの考え方

VBAでは、以下の考え方を覚えるとコードがかなり書きやすくなります。

  • Selectしなくても操作できる
  • Worksheetオブジェクトを直接扱う
  • 同じ処理は汎用化する
  • Caseには比較値を書く
  • Rangeには.Valueを付ける癖をつける

これらを意識するだけで、VBAコードの安定性と読みやすさが大きく向上します。

まとめ

今回のコードが動かなかった最大の原因は、「Select Case」のCase部分に条件式を書いてしまっていたことです。

VBAのSelect Caseでは、比較対象を書く必要があり、以下のように記述します。

Case "Sheet1"

また、VBAではSelectを減らし、Worksheetオブジェクトを直接操作する書き方が推奨されています。今回のようなシンプルな処理であれば、シート名をそのままセルへ代入するだけでも十分実現可能です。

VBAは最初こそ戸惑いますが、「オブジェクトを直接操作する」という考え方に慣れると、一気に理解しやすくなります。

コメント

タイトルとURLをコピーしました