【ExcelVBA】Selection プロパティの使い方
更新日:2023/12/01
ExcelのVBAでSelectionプロパティを使用すると、現在選択されているオブジェクトを取得できます。
主にセルの選択範囲を把握するケースで活躍するプロパティです。
今回は、Selection プロパティの使い方について紹介します。
Selectionプロパティとは
Selectionは、Applicationオブジェクトのプロパティです。
アクティブなワークブックのアクティブシート上で、現在選択されているオブジェクトを返します。
オブジェクト = Application.Selection または オブジェクト = Selection
シート上のオブジェクトは、セルの選択範囲(Range)だけでなく、他のオブジェクトも選択対象に含まれます。
例えば、ChartAreaやPictureオブジェクトです。
そのため、Selectionプロパティで取得したオブジェクトを使用する前に、オブジェクトのタイプを確認する必要があります。
またコード上でブックやシートをアクティブ化していないときは、対象のブックとシートがアクティブ化されていることを確認する必要があります。
オブジェクトタイプの確認
Selectionプロパティで取得したオブジェクトが、目的のタイプと一致するかどうかはTypeNameメソッドで確認します。
Sub selectionSample1()
Const bookName = "Book1.xlsx"
Const sheetName = "Sheet1"
' アクティブブックの確認
If ActiveWorkbook.Name <> bookName Then
Workbooks(bookName).Activate
End If
' アクティブシートの確認
If ActiveSheet.Name <> sheetName Then
Sheets(sheetName).Activate
End If
' オブジェクトタイプの確認
If TypeName(Selection) <> "Range" Then
MsgBox "セルを選択してください"
Else
MsgBox Selection.Address & " が選択されています"
End If
End Sub
上記のコードは、アクティブブックとシートを確認して、アクティブでないときアクティブ化しています。
既にアクティブ化済みなら必要ありません。
オブジェクトのタイプ名がわからない時は、シートにオブジェクトを挿入後に選択状態にして、次のコードを実行します。
Sub objectTypeCheck()
Cells(1, 1).Value = TypeName(Selection)
End Sub
A:1セルにタイプ名が入力されるので、コピペして使用してください。
Selectionプロパティの一覧
Selectionで取得したオブジェクトを使用するには、そのオブジェクトのプロパティを知る必要があります。
そのため、プロパティの一覧があると便利です。
ですがSelectionで取得したオブジェクトは、RangeやPictureなどのオブジェクトです。
非常に多くの種類があるので、ここで一覧にするのは難しいです。
ネット検索で『excel vba range』等を入力して、プロパティを確認してみてください。
Selectionプロパティの使用例
Selectionプロパティでの操作は、セル範囲(Range)を対象にすることが多いです。
ここでは、セル操作についての例をいくつか紹介します。
変数に格納
Selectionはオブジェクトを返すので変数に格納するときは、Setを使用します。
Sub selectionSample2()
Dim rng As Range
Set rng = Selection
MsgBox rng.Address & " が選択されています"
End Sub
Setを使った代入は、慣れていないと意外と忘れやすいですね。
選択されているセルの個数を取得
選択されているセルの個数を取得するときは、Count プロパティを使用します。
Sub selectionSample3()
MsgBox Selection.Count & "個のセルが選択されています"
End Sub
単一選択かどうかを確認するなら、Count プロパティが 1 かどうかを判定します。
選択されているセルの行数と列数を取得
選択されているセルの行数はSelection.Rows.Countで、列数はSelection.Columns.Countで取得できます。
Sub selectionSample4()
MsgBox "行数:" & Selection.Rows.Count & vbCrLf _
& "列数:" & Selection.Columns.Count
End Sub
ちなみに、行は横方向、列は縦方向です。
Range( "D2" ) なら、D列の2行目のセルです。
Cells( 2 , 4 ) なら、4列(D列)の2行目のセルです。
順番が逆になっているので、時々混乱しますね。
左上のセルを取得/操作
選択範囲で左上のセルはSelection.Item(1)で取得できます。
Itemを省略して、Selection(1)と記述することも可能です。
Sub selectionSample5()
' 選択範囲の左上セルに値をセット
Selection(1).Value = 1000
MsgBox "選択範囲の左上の値を " & Selection(1).Value & " に変更しました"
End Sub
左上セルの右側はSelection(2)で取得できます。
以降3,4,5と増加し、範囲の右端に到達したら次の行の左に移ります。
最大値はSelection.Countです。
右下のセルを取得/操作
選択範囲で右下のセルはSelection.Item(Selection.Count)で取得できます。
Sub selectionSample6()
' 選択範囲の左上セルに値をセット
Selection(Selection.Count).Value = 1000
MsgBox "選択範囲の右下の値を " & Selection(Selection.Count).Value & " に変更しました"
End Sub
行の取得/操作
選択範囲から行を取得するときは、Rowsプロパティを使用します。
最初の行はSelection.Rows(1)で、最終行はSelection.Rows(Selection.Rows.Count)で取得できます。
Sub selectionSample7()
' 1行目の全セルの値変更
Selection.Rows(1).Value = 10000
' 1行目の右端のセルの値変更
Selection.Rows(1).Cells(Selection.Columns.Count).Value = 3000
' 最終行の全セルの値変更
Selection.Rows(Selection.Rows.Count).Value = 50000
' 最終行の右端のセルの値変更
Selection.Rows(Selection.Rows.Count).Cells(Selection.Columns.Count).Value = 3000
End Sub
実行すると次のように、選択範囲のセルに値がセットされます。
列の取得/操作
選択範囲から列を取得するときは、Rowsプロパティを使用します。
最初の行はSelection.Columns(1)で、最終行はSelection.Columns(Selection.Columns.Count)で取得できます。
Sub selectionSample8()
' 1列目の全セルの値変更
Selection.Columns(1).Value = 10000
' 1列目の2番目のセルの値変更
Selection.Columns(1).Cells(Selection.Rows.Count).Value = 3000
' 最終列の全セルの値変更
Selection.Columns(Selection.Columns.Count).Value = 50000
' 最終列の2番目のセルの値変更
Selection.Columns(Selection.Columns.Count).Cells(Selection.Rows.Count).Value = 3000
End Sub
実行すると次のように、選択範囲のセルに値がセットされます。
セルの位置/範囲の取得
選択範囲のシート上でのセル位置を取得するときは、最初と最後のセルのColumnとRow プロパティを確認します。
Sub selectionSample9()
Dim result As String
result = "[左上]" & vbCrLf
result = result & " 列:" & Selection(1).Column & vbCrLf
result = result & " 行:" & Selection(1).Row & vbCrLf
result = result & "[右下]" & vbCrLf
result = result & " 列:" & Selection(Selection.Count).Column & vbCrLf
result = result & " 行:" & Selection(Selection.Count).Row & vbCrLf
MsgBox result
End Sub
選択範囲のコピー
Rangeオブジェクトのcopyメソッドを使用すると、セルをコピーできます。
このとき書式も含めてコピーされます。
Sub selectionSample10()
Selection.Copy Range("B2")
End Sub
値のみをコピーするときは、コピー元と同じ範囲のRangeオブジェクトのValueプロパティに、コピー元のValueプロパティを代入します。
Sub selectionSample11()
Range(Cells(2, 2), _
Cells(2 + Selection.Rows.Count - 1, 2 + Selection.Columns.Count - 1)) _
.Value = Selection.Value
End Sub
コピー先の範囲をコピー元に合わせるために、RangeのパラメータにCellsを使用しています。
更新日:2023/12/01
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。