Selectionの使い方

セル

はじめに

 Selection は現在選択されているセルのRangeを示しています。選択されているセルは1つだけでなく複数の場合もあるので、Selection を扱うときは複数のセルが対象になっている可能性を考えて扱う必要があるでしょう。

 以下のコードは「マクロの記録」を使ってB5セルを選択した後、セルの背景色を黄色にした時のものです。

Sub Macro1()
    Range("B5").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

 冒頭で、Select Selection ができます。
 Select はセルを選択するメソッドで、その選択されたセルを示すのが Selection になります。
 
 Selection は選択されたセルなので Range型になります。そのため Selection Rangeの持つプロパティやメソッドをそのまま使用する事ができます。

 Selectionでは、複数のセルが選択されていることを想定するべきでしょう。 例え1つのセルが選択されている場合でも配列に1つの要素が入っているというスタンスで扱う必要があります。
 これはRangeを扱う場合も同じです。

Selection内の最初のセル

 Selectionに限らず、Rangeでは複数のセルを対象とする場合、左上のセルが1番目のセルとして扱われます。

 1番目のセルは、Selection(1) で得る事ができ、この書き方なら Selection の対象が単体でも複数でも使えます。

Range("A1").Select
Selection(1).Value = "aaa"

 A1セルに「aaa」と表示されます。

Range("B1:C3").Select
Selection(1).Value = "bbb"

 B1からC3セルまで選択されますが、B1セルのみ「bbb」と表示されます。

Selection内のセルの数

 Selection内にいくつのセルがあるか調べたい時は、Countプロパティで参照できます。

Selection.Count   '選択セルの数

 選択範囲の右下が一番最後のセルになりますので、右下のセルを示すには以下の様にします。

Selection(Selection.Count)   '選択範囲の最後のセル

Selection内の巡回

 Selection内を巡回したい場合は、以下の様にします。

Sub mySelectionLoop1()
    Dim i As Long
    
    Range("B2:D6").Select
    
    For i = 1 To Selection.Count
        Selection(i).Value = i
    Next i
End Sub

 または、For Each In を使って以下の様にも書けます。

Sub mySelectionLoop2()
    Dim cl As Variant
    Dim cnt As Long
    
    Range("B2:D6").Select
    cnt = 1
    For Each cl In Selection
        cl.Value = cnt
        cnt = cnt + 1
    Next cl
End Sub

Selection内の行と列

 行を示すプロパティはRow、列を示すプロパティはColumn が使えます。

Sub selectionTest1()
    Range("C2:E6").Select
    Debug.Print Selection.Row       '2 (2行目)
    Debug.Print Selection.Column  '3 (C列)
End Sub

 単に、Selection.Row とすると一番目のセルの行数を返します。つまり上記のプログラムは以下のように書いたのと同じです。

Sub selectionTest2()
    Range("C2:E6").Select
    Debug.Print Selection(1).Row       '2 (2行目)
    Debug.Print Selection(1).Column  '3 (C列)
End Sub

 最終行、最終列を得たければ以下のようにします。

Sub selectionTest3()
    Range("C2:E6").Select
    Debug.Print Selection(Selection.Count).Row      '6 (6行目)
    Debug.Print Selection(Selection.Count).Column   '5 (E列)
End Sub

Selection内の行数と列数

 行数はRows.Count プロパティ、列数はColumns.Count プロパティで取得できます。 

Sub selectionTest4()
    Range("C2:E6").Select
    Debug.Print Selection.Rows.Count      '5行
    Debug.Print Selection.Columns.Count   '3列
End Sub

 RowsColumns (複数形)は配列ですのでインデックスで指定できます。
 以下のプログラムでは、選択されたセルの1行目のみ「a」が入力されます。

Sub selectionTest5()
    Range("C2:E6").Select
    Selection.Rows(1) = "a"
End Sub

Selection内の巡回方向を変える

 先の例では、列方向に進んでから次の行に進んでいました。標準ではこの順番で巡回します。
 これを行方向に進んでから次の列に進むように巡回するプログラムを書いてみます。

Sub mySelectionLoop3()
    Dim i As Long, j As Long
    Dim cnt As Long
    
    Range("B2:D6").Select
    
    With Selection
    
    cnt = 1
    For i = 1 To .Columns.Count
        For j = 1 To .Rows.Count
            Selection(1).Offset(j - 1, i - 1) = cnt  'Offsetを使った書き方
            'Selection(1).Cells(j, i) = cnt          'Cellsを使った書き方
            cnt = cnt + 1
        Next j
    Next i
    
    End With
End Sub

 上記の例では、二重のForループでSelectionを巡回します。i と j はSelection内の相対的な位置になりますので、1番目のセルである Selection(1) を起点にオフセット位置で指定しなければなりません。
 Offsetでは、Offset( 0, 0 )起点となりますので、-1 としなければなりません。
 また、コメントアウトされていますが、Cellsもオフセット位置の指定に使えます。こちらはCells( 1, 1 )起点となりますので -1 は不要です。

 次は、For Each In を使った例です。

Sub mySelectionLoop4()
    Dim cC As Variant
    Dim cCR As Variant
    
    Dim cnt As Long
    
    Range("B2:D6").Select
    
    With Selection
    
    cnt = 1
    For Each cC In .Columns
        For Each cCR In cC.Rows
            cCR.Value = cnt
            cnt = cnt + 1
        Next cCR
    Next cC
    
    End With

End Sub

 このプログラムでは、Selection.Columns で一列目のセルを取得し(cC)、取得した一列のセルのそれぞれの行を取得する形で一個づつセル(cCR)を取得しています。

まとめ

 Selection は選択されたセルをRange型で保持しています。セルは複数の場合もあるので、この事を想定して扱うようにします。
 出てきたプロパティをまとめておきます。
 
 Selection(1)       選択セルの 1番目(左上)のセルを指す 【Range型】
 Selection.Count    選択されたセルの数
 Selection(Selection.Count)      選択セルの 最後(右下)のセルを指す 【Range型】
 Selection.Row      選択された1番目(左上)のセルの行 【位置】
 Selection.Column    選択された1番目(左上)のセルの列 【位置】
 Selection(Selection.Count).Row      選択された最後(右下)のセルの行 【位置】
 Selection(Selection.Count).Column    選択された最後(右下)のセルの列 【位置】
 Selection.Rows.Count    選択されたセルの行数
 Selection.Columns.Count  選択されたセルの列数
 Selection.Rows(1)       選択セルの 1番上の段のセルを指す
 【Range型】
 Selection(1).Offset(0, 1)    選択された1番目(左上)のセルの右隣を指す 【Range型】
 Selection(1).Cells(1, 2)     選択された1番目(左上)のセルの右隣を指す 【Range型】

タイトルとURLをコピーしました