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


コメント