Excel VBAを使用した色々なセルの範囲選択方法を覚書。
セルの最終行や最終セルのアドレスの取得、アクティブセル範囲(空白行で囲まれた範囲)を一発で範囲選択する方法などのVBAのサンプルを覚書。
選択したい範囲が固定的でない場合や選択した範囲のセルの一つ一つに同じ処理を実行するVBAのサンプルもついでに覚書きしておく。
VBAを使用した基本的なセルの選択方法
VBAでセルを選択する際に使用する基本的なオブジェクトは、"Range"(レンジ)オブジェクトです。
例えば、特定のセル(ここではA1セルとする)を選択する場合は、以下のように記述します。
Sub samaple()
Range("a1").Select
End Sub
まとまった範囲、例えばセルA1からC10までの範囲を選択する場合は、左上隅のセルのアドレスと右下隅のセルのアドレスを":"でつなげて指定します。
例えば、以下のような感じです。
Sub samaple()
Range("a1:c10").Select
End Sub
VBAを使用した特殊なセルの選択方法
次に特殊なセルを選択する場合のVBAのサンプルプログラムを記載します。
最終セル
特定できないセルを選択したい場合、例えば最終セルを選択したいという場合には以下のようになります。
最終セルの選択方法
Sub samaple()
ActiveCell.SpecialCells(xlLastCell).Select
End Sub
上記VBAのサンプルプログラムの"ActiveCell"は、"今アクティブになっているセル"という意味を持つRangeオブジェクト返します。
SpecialCellsのカッコ内に指定されている"xlLastCell"は最後のセルという意味になります。
上記の1行は、マクロ記録で[Ctrl] + [End]キーを押した場合に選択されるセルと同じです。
.SpecialCells(xlLastCell)を使用する際は少し注意が必要です。
例えば、以下のようにワークシートにデータが入っていた場合、選択されるセルは、"J20"のセルになります。
ここで"J20"のセルの値を[Delete]キーを使用して削除します。
再度VBAのサンプルプログラムのプログラムを実行しても"J20"が選択されます。 なぜ値が入っていない空白のセルにもかかわらず選択されてしまうのかというと、.SpecialCells(xlLastCell)は、単純に最終セルと言うよりは、値が入力された過去があるセルも含めた最終セルという意味になるからです。
最終セルのアドレスを取得する方法
最終セルのアドレスをMsgBox関数で表示するVBAのサンプルプログラムです。
Sub samaple()
ActiveCell.SpecialCells(xlLastCell).Select
MsgBox ActiveCell.Address
End Sub
実行すると以下のように最終セルのアドレスがメッセージボックスに表示されます。
もう少し簡略化というか、最終セルを選択せずに最終セルのアドレスを取得することもできます。
Sub samaple()
MsgBox ActiveCell.SpecialCells(xlLastCell).Address
End Sub
最終セルの行番号と列番号を取得する方法
最終セルの行番号と列番号を取得するVBAのサンプルプログラムです。
Sub samaple()
MsgBox ActiveCell.SpecialCells(xlLastCell).Row
MsgBox ActiveCell.SpecialCells(xlLastCell).Column
End Sub
"Row"が行版号を返し、"Column"は列番号を返します。
列番号となるので、"J"列であっても、数値の"10"が返されます。
アクティブセル領域(空白で囲まれたセル範囲)の選択方法
アクティブセル領域は、空白で囲まれたセル範囲という意味で、ショートカットキーの[Ctrl] + [*]をおした時に選択される範囲を示します。
表全体を一発で選択したい場合などによく使うかと思います。
VBAのプログラムで書くと以下のようになります。
Sub samaple()
Selection.CurrentRegion.Select
End Sub
使用する際は、現在選択されているセルが含まれたアクティブセル領域が選択されることに注意してください。
アクティブセル領域の選択を使用してセルの最終行を取得する方法
ちょっとした応用ですが、よく「表の最後の行番号ってどうやって取得するの?」という質問をされますので、その方法を以下に記載します。
以下のVBAのサンプルプログラムでは、選択された範囲の最終行版号と最終列番号をメッセージボックスで表示します。
Sub samaple()
MsgBox Selection.Rows.Count + Selection(1).Row - 1
MsgBox Selection.Columns.Count + Selection(1).Column - 1
End Sub
ちょっとわかりづらいので簡単に解説すると、"Selection.Rows.Count"は、全体の行数を表しています。
"Selection(1).Row"は、選択された範囲の一番先頭行の行番号を表します。
一番先頭の行番号に選択されている行数を足してマイナス1すると選択範囲の最終行番号が求められます。
文字の説明だとわかりづらいですので一度試してみてください。
列番号の取得も同じ原理です。 ちょっとマニアックですが、こんな方法もあります。
Sub samaple()
Dim strRng As String
strRng = Selection.CurrentRegion.Address
MsgBox Right(strRng, Len(strRng) - InStrRev(strRng, "$"))
End Sub
選択範囲のアドレスを取得する方法
現在選択されている範囲のアドレスを取得するVBAのサンプルプログラムを以下に記載します。
Sub samaple()
MsgBox Selection.CurrentRegion.Address
End Sub
選択されている範囲のセルの1つ1つに同じ処理をする方法
例えば、セルの文字列のアルファベット小文字をアルファベット大文字に置換したい場合など選択されている範囲のセルの1つ1つに決まった処理をしてあげるVBAのサンプルプログラムです。
Sub sample()
For Each Rng In Selection
Rng.Value = UCase(Rng)
Next Rng
End Sub
VBAで色々なセル選択をする方法のまとめ
Excel VBAで色々なセルの選択方法のVBAのサンプルプログラムを紹介しました。
セルの選択方法で質問やこんなことがしたいなど有りましたらコメント欄に記載していただければと思います。
コメント
セルの範囲で同じ値が入力されているセルの最終行を求めたいのですが、どのようなVBAとなりますか?
2019/2/14
2019/2/14
2019/2/14
2019/2/14
2019/2/14
2019/3/7
2019/3/7
2019/3/7
2019/3/7
川上さん、コメントありがとうございます。
サンプルとして記載してもらったデータがA1セルから入力されていると仮定した場合、以下のようなプログラムで可能かと思います。
A1セルを選択した状態で実行すると同じデータが連続している場合は、同じデータの最後のセルが選択された状態でプログラムが終了するはずです。
限定された条件で思いつきで書いたプログラムなので、希望に完全にあったものとは限らないですが…