Selectは「選ぶ」こと、Selectionは「選んでいる部分」を指す
VBAではSelectとSelectionという似た言葉がありますが、用途は全く異なります。
Selectは選択したいものを選択するときに使います。必ず「〇〇.Select」のように何かの後ろに . と一緒に使います。この「〇〇」が選択したいものになります。
Selectionは現在選択されている箇所をオブジェクトとして返します。その選択範囲に対してなんらかの処理や値の操作を行う場合に「Selection.〇〇」のように書くことができますが、. を書いても「〇〇」の候補は表示されません。
SelectとSelectionについて、それぞれの使い方などを以下に説明します。
Selectメソッドは対象が決まっている
SelectはSelectメソッドと呼び、「〇〇.Select」のように書きます。「〇〇」の部分に入るのは選択する対象になります。なお、「Select.××」のようにSelectの右側に何かがくっつくことはありません。
Selectメソッドはセルを表すRangeオブジェクトを選択するときが一番使用頻度が多いと思われます。
例えば、A1セルやB1~C2を選択する場合は、以下のように書きます。
1 2 |
Range("A1").Select Range("B1:C2").Select |
このときに大事なのが、「Range」の5文字がRangeオブジェクトなのではなく、「Range(“A1”)」や「Range(“B1:C2”)」の部分がRangeオブジェクトであるという点です。
以下のコードは上と同じことをやっていますが、Rangeクラスの変数rにA1セルを表す「Range(“A1”)」をコピーし、そのあとで、r.SelectとしてA1セルを選択しています。
1 2 3 |
Dim r As Range Set r = Range("A1") r.Select |
Selectメソッドで大事なのは、選択する対象が「Range(“セル座標”)」とかの書き方ではなく、Rangeオブジェクトを対象にしているかどうかです。
セルのRangeオブジェクトの他にも、Excelブックを表すWorkbookオブジェクトや、ワークシートを表すWorksheetオブジェクトなどがSelectメソッドを持っています。
マウスでクリックしたら選択できるものはSelectメソッドを持っていると考えて大丈夫です。
Selectionプロパティは対象が決まっていない
SelectionはSelectionプロパティと呼び、「Application.Selection」か「Window.Selection」の2つの使い方になります。
省略して「Selection」と書くこともできますが、その場合はアクティブウィンドウが対象になります。
いずれの場合も、Selectionプロパティは選択されているオブジェクトを返します。ただ、何が選択されているのかはその時々で違います。
Selectionプロパティは「選択しているもの」を表します。例えば、セルを選択していれば、Selectionプロパティでそれを参照できます。
以下のコードはセルの選択範囲をループして1セルずつ値を出力します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub SelectionTest1() Dim r As Range '// セル '// 選択セルの背景色を設定 Selection.Interior.Color = vbRed '// 選択範囲のセルを1つずつループ For Each r In Selection '// セルの値をイミディエイトウィンドウに出力 Debug.Print r.Value Next End Sub |
上のコードはFor EachのループでSelectionプロパティを選択範囲のコレクションとして利用していましたが、次のコードはやっていることは同じですが選択セル範囲をRangeクラス型の変数srにコピーして利用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub SelectionTest2() Dim sr As Range '// Selectionが示す選択範囲 Dim r As Range '// セル '// セル選択範囲を取得 Set sr = Selection '// 選択セルの背景色を設定 sr.Interior.Color = vbRed '// 選択範囲のセルを1つずつループ For Each r In sr '// セルの値をイミディエイトウィンドウに出力 Debug.Print r.Value Next End Sub |
1番目のコードの方が短いですが、2番目はRangeオブジェクトにコピーして利用しているためSelectionプロパティが何であるかが明示されることでコードが分かりやすくなります。また、srの右で . を入力するとメソッドやプロパティの候補が表示される利点があります。
Selectメソッドで選択したあとにSelectionプロパティで参照する
Selectメソッドは実行する度に選択対象が更新されます。
また、Selectionプロパティも同様に、参照した時点で選択されているオブジェクトを返します。
そのため、以下のようにSelectメソッドで選択対象が変わったあとにSelectionプロパティでセル座標を参照すると、その度に参照先が変わっていることが分かります。
1 2 3 4 5 6 7 |
Sub SelectSelection() Range("A1").Select Debug.Print Selection.Address Range("B2:C3").Select Debug.Print Selection.Address End Sub |
実行結果
$A$1
$B$2:$C$3