はじめに:Selectionって何?
Excel VBAを使ってマクロを組む際、「Selection」という単語をよく目にします。
Selectionとは、現在選択中の範囲を意味しています。セル範囲を選択していればそれがSelectionになり、それとは別に、オートシェイプを複数選択していればそれがSelectionになります。
何を選択しているかは関係ありません。「選択しているもの=Selection」になります。
Selectionにはマウスやキーボードで選んだ選択範囲を指しているため、その選択範囲に対してVBAから処理を行うときにSelectionを使います。
特に選択セル操作を行う場合にはSelectionは必須ですが、使い方を間違えると意図しない動作や処理ミスにつながることもあります。
この記事では、Selectionの使い方を基礎から応用までわかりやすく解説します。
選択範囲の各セルを1つずつ処理する基本パターン
選択しているセル範囲を1つ1つのセルとして処理するには、次のようにFor Eachループを使います。
以下のコードを実行すると選択セル範囲の各セルの背景色を黄色にします。
サンプルコード:選択セルの範囲を黄色にする
1 2 3 4 5 6 7 8 9 |
Sub SelectionForEachSample() Dim r As Range '// セル '// 選択セル範囲を1つずつループ For Each r In Selection '// セルの背景色を黄色にする r.Interior.Color = vbYellow Next End Sub |
このように、Selectionを使えば選択した範囲への処理を行うことが可能になります。
サンプルコード:選択セル範囲を処理する場合の基本形
1 2 3 4 |
Dim r As Range For Each r In Selection '// ここにセルに行いたい処理を書く。 Next |
この書き方は選択セル範囲を処理する際の基本形になります。
セルを1つずつ処理するため、セルの値を消す(r.Value = “”)、空白セルか判定する(If r.Value = “” Then)、などのセル範囲を一括して処理を行う際には必ずと言っていいほど使うコードになります。
Selectionを使うときの注意点
上で少し書きましたが、Selectionはセルだけでなくオートシェイプなども対象になることがあります。
そのため、Selectionがセル選択範囲を前提としたコードを書いている場合に、オートシェイプを選択した状態で実行すると、「アプリケーション定義またはオブジェクト定義のエラーです」という「セルじゃないのでダメ」という趣旨のエラーが発生します。
何が選択されているかを判定するにはTypeName関数を使えば分かります。「TypeName(Selection)」が”Range”であればセルを選択している、という意味になるため、そのIf文の中でセルの処理を書けばセルではない場合のエラーを回避できます。
1 2 3 |
If TypeName(Selection) = "Range" Then Selection.Value = "OK" End If |
TypeName関数の詳細は「VBAでオブジェクトや変数の種類を調べる(TypeName)」をご参照ください。
Selectionを使わない書き方
Selectionはその時点で選択されているものが対象になります。
ただ、実際のVBAのコードに実行してもらいたいことは、「セル範囲を一括で色をつけたい」のように、どのセルを処理したい、という目的がはっきりしていることの方が多いです。
このような場合はSelectionを使わずにセルを表すRangeオブジェクトを使ってコードを書いた方が確実です。
以下はRangeオブジェクトを使って直接セルを指定して処理を行うコードです。A1からB3セルに「OK」を入力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub InputOKSample() Dim r As Range '// セル1つ Dim rSelection As Range '// セル範囲 '// セル範囲をセット(セル選択とは関係なく、セル範囲を指定する) Set rSelection = Range("A1:B3") '// セル範囲を1つずつループ For Each r In rSelection '// 現ループのセルに"OK"を入力 r.Value = "OK" Next End Sub |
このように、マウスでセルを選択しておかなくてもセル範囲に対して処理を行うことが可能です。
まとめ。Selectionの使い方は「選択範囲」を使いたいときだけでよい。それ以外はRangeでOK
Selectionはマウスで選択したセル範囲に対して処理を行うことが出来る大事な仕組みですが、「選択しているセル範囲に処理を行いたい(=Selectionを使う)」のか「あるセル範囲に処理を行いたい(=Selectionは使わなくてよい)」のかでSelectionを使う必要がないことも多々あります。
- 手動で範囲を選ぶときは、Selectionを使う。
- 処理をしたい箇所が決まっている場合は、Rangeを使う。
厳密にはCellsなどの話もあるのですが、初心者の場合は「セル範囲はSelectionかRangeのどっちかを使う」と割り切っちゃって構いません。