Excel VBAを学び始めると、必ずと言っていいほど耳にするのが
「Selectionは使うな」 という言葉です。
確かに、VBAの参考書や技術記事では、
Selectionを使ったコードは「悪い例」として扱われることが多く、
使わないほうが良い理由も数多く紹介されています。
しかし実務の現場では、
「Selectionを一切使わないコード」だけが正解とは限りません。
- なぜSelectionは嫌われるのか
- 本当に使ってはいけないのか
- どんな場面なら使っても問題ないのか
- 実務ではどう判断すべきなのか
この記事では、Selectionを感情論や暗黙ルールで否定するのではなく、
設計・保守・実務判断の観点から正しく整理します。
「とりあえずSelectionはダメ」と言われて混乱している方、
「書き換えろと言われたけど理由が分からない方」は、
ぜひ最後までご覧ください。
目次
- ✅ なぜSelectionは「使うな」と言われるのか
- ・Selectionとは何か
- ✅ Selectionを使うと何が問題になるのか
- ・処理対象が不安定になる
- ・コードを読んでも何をしているか分からない
- ✅ Selection依存コードが実務で壊れやすい理由
- ・シート構成変更に弱い
- ・自動処理と相性が悪い
- ✅ 「Selectionを使わない」基本形の考え方
- ・RangeやCellsで直接指定する
- ✅ Selectionを使わないことで得られるメリット
- ・処理速度が安定する
- ・コードが短くなる
- ✅ それでもSelectionを「使ってもよい」ケースとは
- ・ユーザー操作を前提としたマクロ
- ✅ Selectionを使うなら必ず入れるべき安全対策
- ・型チェックを必ず行う
- ・対象範囲を制限する
- ✅ Selectionを使わずに「選択風の操作」を実現する方法
- ✅ 実務での判断基準まとめ(最重要)
- ・Selectionを使わないべきケース
- ・Selectionを使ってもよいケース
- ✅ 「Selectionは悪」ではなく「設計の問題」
- ✅ (補足)既存マクロでSelectionだらけの場合の対処法
- ✅ まとめ:Selectionは「使う・使わない」ではなく「使いどころ」
✅ なぜSelectionは「使うな」と言われるのか
Selectionが嫌われる理由は、単なる流行や宗教的なものではありません。
VBAの特性と実務環境を考えると、確かに問題が起こりやすい書き方であるのは事実です。
特に、初心者が無意識に多用すると、後から大きなトラブルに発展します。
ただし、その理由を理解せずに「禁止事項」として覚えると、
本質的なVBA設計力は身につきません。
まずは、Selectionが問題視される根本原因を整理しましょう。
・Selectionとは何か
Selectionとは、現在選択されているオブジェクトを指します。
Selection.Value = "テスト"
このコードは、
「今ユーザーが選択しているセル」に値を入れる、という意味になります。
一見するとシンプルで分かりやすいですが、
処理対象がコード上で明示されていないという重大な特徴があります。
✅ Selectionを使うと何が問題になるのか
・処理対象が不安定になる
Selectionは、ユーザー操作に依存します。
- 実行前にどこを選択していたか
- 実行中にクリックされたか
- 他の処理で選択が変わったか
これらによって、処理結果が簡単に変わってしまいます。
・コードを読んでも何をしているか分からない
Selection.Font.Bold = True
このコードだけを見ても、
- どのシートの
- どのセル範囲に
- 何をしているのか
が一切分かりません。
保守・引き継ぎの場面では、これは致命的です。
✅ Selection依存コードが実務で壊れやすい理由
Selectionを前提としたコードは、
環境が変わると簡単に壊れます。
・シート構成変更に弱い
- 列が追加された
- 行数が増えた
- シート名が変わった
このような変更が入ると、
Selectionが想定外の場所を指す可能性があります。
・自動処理と相性が悪い
- ボタン実行
- 定時バッチ
- 他マクロからの呼び出し
Selectionは「人が操作している前提」の概念なので、
自動処理では特に不安定になります。
✅ 「Selectionを使わない」基本形の考え方
Selectionを避ける基本的な考え方はシンプルです。
「操作対象はコードで明示する」
・RangeやCellsで直接指定する
Range("A1").Value = "テスト"
Cells(1, 1).Value = "テスト"
これだけで、
- 対象が明確
- 安定して動く
- 他人が読んでも理解できる
というコードになります。
✅ Selectionを使わないことで得られるメリット
・処理速度が安定する
Selectionを使うコードは、
Select → Selection の流れが入りがちです。
Range("A1").Select
Selection.Value = "テスト"
これは、
- 不要な画面更新
- 余計な内部処理
を発生させ、処理速度を落とします。
・コードが短くなる
Range("A1").Value = "テスト"
これだけで済むため、
可読性・保守性が大幅に向上します。
✅ それでもSelectionを「使ってもよい」ケースとは
ここが重要なポイントです。
Selectionは絶対悪ではありません。
・ユーザー操作を前提としたマクロ
次のようなケースでは、Selectionを使う意味があります。
- ユーザーが選択したセルを加工する
- 選択範囲をそのまま処理対象にしたい
- マクロの意図が「選択したものに対する操作」である
If TypeName(Selection) = "Range" Then
Selection.Font.Bold = True
End If
この場合、
Selectionが仕様そのものなので、問題ありません。
✅ Selectionを使うなら必ず入れるべき安全対策
Selectionを使う場合は、
無条件で使ってはいけません。
・型チェックを必ず行う
If Not TypeOf Selection Is Range Then
MsgBox "セルを選択してください。"
Exit Sub
End If
これにより、
図形やグラフ選択時のエラーを防げます。
・対象範囲を制限する
If Intersect(Selection, Range("A1:A100")) Is Nothing Then
MsgBox "指定範囲を選択してください。"
Exit Sub
End If
Selectionを野放しにしないことが重要です。
✅ Selectionを使わずに「選択風の操作」を実現する方法
Selectionを使わず、
見た目だけ選択したように見せることも可能です。
Range("A1").Activate
ActivateはSelectionより影響範囲が限定されます。
※ただし、これも最小限にすべきです。
✅ 実務での判断基準まとめ(最重要)
Selectionを使うかどうかは、
次の基準で判断してください。
・Selectionを使わないべきケース
- 自動処理
- 定期実行
- 他マクロから呼ばれる処理
- 対象範囲が事前に分かっている
・Selectionを使ってもよいケース
- ユーザーが選択した範囲を処理する
- 操作補助ツール
- インタラクティブなマクロ
✅ 「Selectionは悪」ではなく「設計の問題」
Selectionを使う・使わないは、
技術力の優劣ではありません。
重要なのは、
- なぜ使っているのか
- そのSelectionは仕様か偶然か
- 他人が見て理解できるか
この視点を持つことです。
参考:【VBA】「単一・複数・非連続・行・列・アクティブ」セルの選択方法
✅ (補足)既存マクロでSelectionだらけの場合の対処法
実務では、
Selectionだらけの既存マクロを引き継ぐこともあります。
その場合、
- 処理の意図を把握
- 操作対象を明確化
- Range・Cellsへ置き換え
という手順で、
少しずつ改善するのが現実的です。
✅ まとめ:Selectionは「使う・使わない」ではなく「使いどころ」
- Selectionは不安定になりやすい
- 自動処理では原則使わない
- ユーザー操作前提なら使ってよい
- 使うなら必ず安全対策を入れる
- 判断基準を持つことが最重要
Selectionを正しく理解できるようになると、
VBAコードは一段階上の設計レベルに進みます。
「なんとなく禁止」ではなく、
理由を理解した実務判断をできるようになりましょう。