Excel VBAでセルの選択を判定する方法のまとめ
Excel VBAでセルの選択を判定する方法をまとめました。
1.はじめに
仕事で、ExcelのB列以降のセル(複数行)にデータを設定したあと、A列に○印などの文字を設定して出力ボタンをクリックすると、その行の内容をCSVで出力するようなVBAを作りました。
が、A列に印をつけるのは一時的なものなので、A列のセルを選択状態にして出力ボタンをクリックすれば、その行の内容をCSVで出力するようにしました。
ということでセルの選択状態を判定する方法を調べましたので、本エントリーでまとめておきます。
前半で選択されたセルの取得方法、後半で選択セルの判定方法を紹介します。
2.セルの行と列を取得する
セルの行と列を取得するには「ActiveCell.Column」および「ActiveCell.Row」を利用します。
Sub sample()
MsgBox ActiveCell.Column & " " & ActiveCell.Row
End Sub
「ActiveCell.Column」は選択されたセルの列、「ActiveCell.Row」は選択されたセルの行を表示します。
1つのセルを選択した場合、そのセルの行と列を表示します。
複数のセルが選択されている場合、最若番のセルの行と列のみを表示します。
Ctrlキーで複数のセルをばらばらに選択している場合、最後にカーソルがあたっているセルの行と列を表示します。
3.セルの番地を取得する
セルの番地を取得するには「ActiveCell.Address」を利用します。
Sub sample()
MsgBox ActiveCell.Address(False, False, xlA1)
End Sub
Addressプロパティのパラメータの意味は次のとおりです。
- 第1パラメータ:行の形式(True:絶対参照形式/False:相対参照形式)
- 第2パラメータ:列の形式(True:絶対参照形式/False:相対参照形式)
- 第3パラメータ:セル名の取得形式(xlA1:A1参照形式/xlR1C1:R1C1参照形式)
1つのセルを選択した場合、そのセルの行と列を表示します。
複数のセルが選択されている場合、最若番のセルの行と列のみを表示します。
Ctrlキーで複数のセルをばらばらに選択している場合、最後にカーソルがあたっているセルの行と列を表示します。
4.選択されたすべてのセルの番地を取得する
選択されたすべてのセルの番地を取得するには、Selectionプロパティを利用します。
Sub sample()
MsgBox Selection.Address(False, False, xlA1)
End Sub
複数選択の場合、その一番上のセルと一番下のセルの番地を表示します。
選択範囲が矩形の場合、左上と右下の番地を表示します。
Ctrlキーで複数のセルをばらばらに選択している場合、カンマ区切りで番地を表示します。
5.繰り返し処理の中でセルが選択されていることを判定する
本題です。
「Sheet1」シートのB1からB10までのセルを順次サーチし、セルが選択されていることを判定する場合はIntersectメソッドを利用します。
Sub sample()
Dim i As Integer
for i = 1 To 10
If Not Application.Intersect(ThisWorkbook.Worksheets("Sheet1").Cells(i, 2), Selection) Is Nothing Then
MsgBox "セルが選択されています:" & Application.Intersect(ThisWorkbook.Worksheets("Sheet1").Cells(i, 2), ActiveCell).Address(False, False)
End If
Next i
End Sub
Intersectメソッドのパラメータには
- 第1パラメータ:範囲1
- 第2パラメータ:範囲2
を指定し、それぞれの範囲でセルを共有している場合にセルの情報を返却します。
セルを共有している場合には「Nothing」を返却します。
If文を「Not ~ Is Nothing」としているのは、「共有しているセルがNothingでなければ~」という判定を行っているためです。
ここでは選択したすべてのセルを対象にしたいので、4項の「Selection」を利用しています。
アクティブなセルだけを対象にしたい場合は、「Selection」を1項または2項で紹介した「ActiveCell」を利用します。
If Not Application.Intersect(ThisWorkbook.Worksheets("Sheet1").Cells(i, 2), ActiveCell) Is Nothing Then
6.ある範囲に選択されたセルが含まれていることをまとめて判定する
ある範囲に選択されたセルが含まれていることをまとめて判定するには、5項の判定文でRangeを利用します。
Sub sample()
If Not Application.Intersect(Selection, Range("B1:B10")) Is Nothing Then
MsgBox "セルが選択されています:" & ActiveCell.Address(False, False)
End If
End Sub
ただし、この方法では1つのセルの情報しか取得できないようです。
7.参考サイト
参考サイトは下記です。ありがとうございました。