次に入力するセルを選択させておきたい
Excelの資料には、表形式などのなにかしらフォーマットが決められていることが多々あります。
例えば、A列が日付で、B列が担当者、C列が連絡事項で、D列が、、、という感じです。
そういうフォーマットの資料に数値計算やブック保存時などのなんらかのマクロを実装する場合、「さらに便利にしたい」ということで、次に入力するセルへ自動で移動させておきたい、と思う方が結構いらっしゃるようです。
上の絵の場合は、最終行が9行目であれば、A10セルを選択させておく、というマクロです。
考え方としては簡単なのですが、実際にこれをコードにするには、ちょっと工夫が必要です。
次に入力するセルを選択する方法
以下の関数はアクティブシートで入力されているセル範囲の次の空白セルを選択します。
1 2 3 4 5 6 7 8 9 |
Sub SelectNextCell() Dim sht As Worksheet Dim r As Range Set sht = ActiveSheet Set r = sht.UsedRange Cells(r.Row + r.Rows.Count, r.Column).Select End Sub |
コードとしては短いのですが、Rangeオブジェクトに慣れていない場合には、何やってるのかよくわからないと思います。
要点はUsedRangeプロパティです。
UsedRangeプロパティはシートに入力されているセル範囲を四角で囲った状態で取得します。
例えば、上の絵で言うと、一番左上に入力されているセルの位置がA1セルで、一番右下に入力されているセルの位置がC6セルとすると、A1、A9、C1、C6セルの4点を結んだ四角枠の状態になっている部分がUsedRangeが表す範囲になります。
UsedRangeのRowプロパティはその四角範囲の中で一番上にある行位置を表し、UsedRangeのRowsプロパティは四角範囲の行全体を表し、そのCountプロパティは四角範囲の行数を表します。Columnプロパティは四角範囲で一番左の列位置を表します。
それらのプロパティを使って、Cells(行位置、横位置)の座標として使っています。
上の例(A1とC9の四角範囲)であれば、行位置はr.Row(=1) と r.Rows.Count(=9) を加算すると空白セルがある10行目に当たり、横位置はr.Column(=3)の3列目に当たり、A10セルが対象となります。
それ(UsedRangeの四角のすぐ下のセル)をSelectすれば次の空白セルが選択されることになります。
シートの最終行から上に向かって最初に見つかるセルの次は?
他にも空白セルを選択する考え方があります。
次の空白セルを探す際に、シートの最終行である1048576行目まで行って、そこからCtrl + 上矢印で見つかったセルの1個下を次の空白セルとする、という考え方もあります。
この考え方は厳密にいうと次のセルにはならない場合がありますが、この方法の方が都合がいい場合もあります。
この場合のコードは以下のようになります。
1 2 3 4 5 6 7 8 9 |
Sub SelectNextCell2() Dim sht As Worksheet Dim r As Range Set sht = ActiveSheet Set r = sht.UsedRange Cells(r.Row + r.Rows.Count, r.Column).End(xlDown).End(xlUp).Offset(1, 0).Select End Sub |
先のコードと似ていますが、動きは結構違います。
- 「Cells(r.Row + r.Rows.Count, r.Column)」でUsedRangeのセル範囲の左下の1つ下の空白セルを起点とします。(上のコードとここまでは同じ)
- そこから「End(xlDown)」でシートの一番下まで移動します。
- 一番下にある状態から「End(xlUp)」で上に向かって最初に入力されているセルまで移動します。
- そして、「Offset(1, 0)」で見つかった入力セルの1つ下のセルに移動して、Selectしています。
まとめると、一番下に行って、上に向かって最初に見つかる位置の1つ下、を選択します。なので、UsedRangeの四角範囲は無関係になります。