VBAで自動化 VBA一覧 セル・シート・ブック操作 操作方法(選択・指定)

【VBA】Selectionは使うべき?使わないべき?正しい考え方と実務判断

Excel VBAを学び始めると、必ずと言っていいほど耳にするのが
「Selectionは使うな」 という言葉です。

確かに、VBAの参考書や技術記事では、
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だらけの既存マクロを引き継ぐこともあります。

その場合、

  1. 処理の意図を把握
  2. 操作対象を明確化
  3. Range・Cellsへ置き換え

という手順で、
少しずつ改善するのが現実的です。


 

✅ まとめ:Selectionは「使う・使わない」ではなく「使いどころ」

  • Selectionは不安定になりやすい
  • 自動処理では原則使わない
  • ユーザー操作前提なら使ってよい
  • 使うなら必ず安全対策を入れる
  • 判断基準を持つことが最重要

Selectionを正しく理解できるようになると、
VBAコードは一段階上の設計レベルに進みます。

「なんとなく禁止」ではなく、
理由を理解した実務判断をできるようになりましょう。

参考:【VBA】Range・Cells・Rows・Columnsの指定方法を徹底解説【基本と使い分け】

    -VBAで自動化, VBA一覧, セル・シート・ブック操作, 操作方法(選択・指定)