Excel

【ExcelVBA】Selection プロパティの使い方

更新日:2023/12/01

ExcelのVBAでSelectionプロパティを使用すると、現在選択されているオブジェクトを取得できます。
主にセルの選択範囲を把握するケースで活躍するプロパティです。
今回は、Selection プロパティの使い方について紹介します。

 

Selectionプロパティとは

Selectionは、Applicationオブジェクトのプロパティです。
アクティブなワークブックのアクティブシート上で、現在選択されているオブジェクトを返します。

オブジェクト = Application.Selection
  または
オブジェクト = Selection

シート上のオブジェクトは、セルの選択範囲(Range)だけでなく、他のオブジェクトも選択対象に含まれます。
例えば、ChartAreaやPictureオブジェクトです。

Rangeや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

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。