「Select回避」とは何か ― “選択してから操作する”クセをやめる発想
まず前提から整理します。
Excel を手で操作するとき、あなたは必ず「選択してから操作」しています。
A1 をクリックして選択 → 文字を入力
A1:C3 をドラッグして選択 → 塗りつぶし
B2 をクリックして選択 → コピーして貼り付け
この「選択してから操作する」感覚のまま VBA を書くと、こうなります。
Range("A1").Select
Selection.Value = "こんにちは"
VBこれが、いわゆる「Select を多用するコード」です。
「Select回避」とは、この“選択してから操作する”書き方をやめて、最初から“対象を直接指定して操作する”書き方に変えることです。
なぜ Select を避けるべきなのか ― 問題点を具体的に見る
コードが長く・読みにくく・壊れやすくなる
Select を使うと、ほぼ必ず Selection とセットで出てきます。
Range("A1").Select
Selection.Value = "OK"
Range("B1").Select
Selection.Font.Bold = True
VBこれを「Select回避」で書き直すと、こうなります。
Range("A1").Value = "OK"
Range("B1").Font.Bold = True
VB見比べると分かる通り、
Select を使うと「一度選択してから、Selection に対して操作する」という余計なステップが入ります。
その結果、
行数が増える
「今の Selection が何なのか」を常に追いかけないといけない
途中でアクティブシートが変わると、意図しない場所をいじる危険がある
という問題が出てきます。
ユーザー操作や画面状態に依存してしまう
Select や ActiveSheet、ActiveCell に頼るコードは、
「今どのシートがアクティブか」「どのセルが選択されているか」によって動きが変わります。
例えば、こういうコード。
Range("A1").Select
Selection.Value = "OK"
VBこれは「アクティブなシートの A1」に書き込みます。
もしユーザーが別のシートをクリックしていたら、全然違うシートの A1 に書き込まれてしまいます。
一方、Select を回避してこう書けば、
ThisWorkbook.Worksheets("入力").Range("A1").Value = "OK"
VBアクティブシートがどこであろうと、必ず「このブックの“入力”シートの A1」に書き込みます。
「どこを触るか」をコードの中で完全にコントロールできる、これが Select回避の本質的なメリットです。
具体例で学ぶ:Select を使う書き方 → 使わない書き方
例1:セルに値を書き込む
悪い例(よくあるパターン):
Sub BadSample1()
Sheets("入力").Select
Range("A1").Select
Selection.Value = "こんにちは"
End Sub
VBSelect回避の書き方:
Sub GoodSample1()
ThisWorkbook.Worksheets("入力").Range("A1").Value = "こんにちは"
End Sub
VBポイントは、
シートを Select しない
セルも Select しない
「どのブック → どのシート → どのセル → 何をするか」を一行で書く
ということです。
例2:範囲をコピーして別の場所に貼り付ける
悪い例:
Sub BadSample2()
Sheets("入力").Select
Range("A1:C10").Select
Selection.Copy
Sheets("集計").Select
Range("B2").Select
ActiveSheet.Paste
End Sub
VBSelect回避の書き方:
Sub GoodSample2()
Dim wb As Workbook
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Set wb = ThisWorkbook
Set wsSrc = wb.Worksheets("入力")
Set wsDst = wb.Worksheets("集計")
wsSrc.Range("A1:C10").Copy Destination:=wsDst.Range("B2")
End Sub
VBここでの大事なポイントは、
コピー元シート・コピー先シートを変数で握る
Range.Copy Destination:= で「コピーと貼り付け」を一気に書く
Select や ActiveSheet に一切頼らない
という構造です。
これだけで、コードの意図が「どこからどこへ」か一目で分かるようになります。
「Select回避」の基本パターンを体に入れる
パターン1:「Selection.○○」を「Range(…).○○」に置き換える
よくある初心者コード:
Range("A1").Select
Selection.Font.Bold = True
VBこれを、こう書き換えます。
Range("A1").Font.Bold = True
VB考え方はシンプルで、
「選択してから Selection に対してやっていること」を
「最初から対象の Range に対してやる」
だけです。
同じように、
Range("A1:C10").Select
Selection.ClearContents
VBは、
Range("A1:C10").ClearContents
VBにできます。
パターン2:ActiveSheet / ActiveCell をやめて、必ずシートとセルを明示する
悪い例:
ActiveSheet.Range("A1").Value = "OK"
ActiveCell.Offset(1, 0).Value = "次"
VB良い例:
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1").Value = "OK"
ws.Range("A1").Offset(1, 0).Value = "次"
VB「今アクティブなシート」「今アクティブなセル」に頼るのではなく、
「どのシートの、どのセルを基準にするか」を自分で決めて書くのが Select回避の考え方です。
どうやって Select をやめていくか ― 実践的なコツ
ステップ1:まずは「録画マクロ」を Select回避で書き直してみる
マクロの記録機能を使うと、ほぼ確実に Select だらけのコードが出てきます。
例えば、こんな感じです。
Sub Macro1()
Range("A1").Select
Selection.Value = "テスト"
Range("B1").Select
Selection.Font.Bold = True
End Sub
VBこれを、自分の手でこう書き換えてみてください。
Sub Macro1_Clean()
Range("A1").Value = "テスト"
Range("B1").Font.Bold = True
End Sub
VBこの「書き換え作業」こそが、Select回避の一番いい練習になります。
録画マクロは「やりたいことのヒント」として使い、
最終的なコードは必ず Select を消した形に整える、という習慣をつけていきましょう。
ステップ2:「今、何を選択しているか」を追うのをやめる
Select を使うコードは、常に「今の Selection は何か?」を追いかける必要があります。
これは、読んでいてとても疲れます。
Select回避のコードは、
「この ws の、この Range に対して、これをする」
としか書いていないので、
“状態を追いかける”必要がなくなり、読むのも書くのも圧倒的に楽になります。
まとめ:Select回避は「Excelを“操作する”コード」から「対象を“指定する”コード」への進化
Select回避の本質は、
「人間がマウスで“選択してから操作する”感覚を、そのままコードに持ち込むのをやめて、
最初から“どのブック・どのシート・どの範囲に何をするか”をはっきり指定するスタイルに変えること」
です。
押さえておきたいポイントをコンパクトにまとめると、
Select + Selection は、コードを長く・読みにくく・壊れやすくする
ActiveSheet / ActiveCell に頼らず、「どのシート・どのセルか」を毎回明示する
録画マクロは“たたき台”として使い、最終的には Select を消した形に書き直す
「選択してから操作」ではなく、「対象を直接指定して操作」という発想に切り替える
