RangeSelectionプロパティ
現在の選択セル範囲を参照する場合にSelectionプロパティを利用することが多々あります。
ただ、Selectionプロパティはセル範囲だけでなくオートシェイプやグラフなどのセル以外も「選択している対象」として利用することができるため、Selection=選択セル範囲という前提のコードを書くと、セル以外を選択しているときにエラーが発生することになります。
Excelではセルと図を同時に選択することは出来ないように、1度に選択できる対象は1種類に限定されますが、現時点で図やグラフを選択していても、その直前まで選択していたセル範囲の情報が欲しい場合があります。
例えば、先にA1からB3セルまでを選択しているとします。
その後、オートシェイプを選択します。その場合セルの選択状態は外れます。
この状態のときに、直前に選択していたA1からB3セルの選択状態が欲しい場合に、RangeSelectionプロパティを利用します。
なお、セルを選択している状態であっても、RangeSelectionプロパティを使えばもちろんセル範囲の情報を取得できます。
構文
Window.RangeSelection As Range
親オブジェクト | 親オブジェクトとしてWindowオブジェクトを指定します。
Selectionプロパティの場合は親オブジェクト不要ですがRangeSelectionプロパティの場合は必須です。 |
戻り値 | 直近の選択セル範囲を示すRangeオブジェクトを返します。 |
RangeSelectionプロパティの用途
多くの場合はSelectionプロパティで事足りますが、グラフや図がある場合にはそれらを選択している場合のエラー回避を考慮する必要があります。
そのような場合やどうしてもセルのRangeオブジェクトが必要な場合や、上記エラー処理自体が面倒な場合にはRangeSelectionプロパティを利用します。
多くの場合はSelectionプロパティよりもRangeSelectionプロパティを使った方が利点が多いと思われます。
ただ、欠点として必ずWindowオブジェクトを指定しなければならない点があります。
WindowオブジェクトであればActiveWindowオブジェクトを使うことが一番多いと思いますので、大抵の場合は「ActiveWindow.RangeSelection」と書いて選択セル範囲を参照すればいいのですが、他ウィンドウの処理を行う場合などはWindowsコレクションを利用する必要が場合によっては出てきたりします。
場合によってはセルが選択されていない場合はエラーとして、セルが選択されていないことを通知するための処理しなければならないこともありますので、そのような場合はむしろRangeSelectionプロパティは邪魔になります。
と、ここまで書いてますが私自身はSelectionプロパティを使うことの方が圧倒的に多いです。
サンプルコード
選択セル範囲をSelectionプロパティではなくRangeSelectionプロパティを使って取得するサンプルです。
6行目が「Set rSelection = Selection」になればSelectionプロパティでの書き方になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub RangeSelectionTest() Dim rSelection As Range '// 選択セル範囲 Dim r As Range '// ループ中の1セル '// 直近の選択セル範囲を取得 Set rSelection = ActiveWindow.RangeSelection '// 選択セル範囲の位置を出力 Debug.Print rSelection.Address(False, False) '// 1セルずつループ For Each r In rSelection '// 対象セルの位置を出力 Debug.Print r.Address(False, False) Next End Sub |
実行結果
A1:B3
A1
B1
A2
B2
A3
B3