Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Select回避

Excel VBA VBA
スポンサーリンク

「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
VB

Select回避の書き方:

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
VB

Select回避の書き方:

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 を消した形に書き直す
「選択してから操作」ではなく、「対象を直接指定して操作」という発想に切り替える

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