行の途中に空白行がある場合でも表の最終行の行番号の取得と最終行のセルの選択を行う方法を覚書。
行の間に空白セルがない場合はとても簡単だけれど、空白行が含まれる場合はちょっと工夫が必要になります。
値が連続している場合の最終行の選択と行番号の取得
空白行が含まれていない場合の最終行の選択と行番号の取得方法のサンプルです。
キー操作の[Ctrl] + [↓]を押した場合と同じ動作です。
上記のキー操作をマクロ記録で録っても同じコードが出力されます。
基本VBAサンプルプログラム
Sub Sample01()
Dim lngRow As Long
'開始位置を選択
Range("a1").Select
Selection.End(xlDown).Select
'行番号を表示
MsgBox Selection.Row
End Sub
空白セルがなく、連続してデータが入力されていることが保証されている場合は上記のプログラムで十分ですが、空白セルがある場合はもう少し工夫が必要です。
行の途中に空白セルがあっても最終行を取得、選択するVBAのサンプルプログラム
例えば以下のアンケート結果の集計表のように、途中に空白セル(アンケート対象者が無回答だった)や空行が含まれる場合はそれを考慮した処理が必要になります。
空白セルや空行を考慮したVBAのサンプルプログラム
Sub Sample02()
Dim lngRow As Long, rng As Range
Range("a1").Select
'選択されたセルがExcelの最終行になるまでループ
Do Until Selection.Row = "1048576"
lngRow = Selection.Row
Set rng = Selection
Selection.End(xlDown).Select
Loop
'最終行を選択
rng.Select
MsgBox lngRow
End Sub
上記サンプルプログラムの"1048576" は、Excelの最終行番号を表しています。
Excelのバージョンによっては最終行番号が異なりますので、以下の表を参考に使用しているバージョンに合わせた値に変更して下さい。
Excelの各バージョンと最大行数
Excelの各バージョンと最大行数は以下のとおりです。
Excelのバージョン | 最大行番号 |
---|---|
Excel 2013 | 1048576 |
Excel 2010 | 1048576 |
Excel 2007 | 1048576 |
Excel 2003 | 65536 |
Excel 2002 | 65536 |
Excel 2000 | 65536 |
Excel 97 | 65536 |
Excel 95 | 65536 |
サンプルプログラムのポイント
上記サンプルプログラムのポイントとしては、最終行に到達するまで"Selection.End(xlDown).Select"を繰り返し実行させ、最終行にたどり着く1つ前に"Selection.End(xlDown).Select"で選択されたセルが表の最終行という判断をさせている点です。
実際にキー操作で行ってみるとわかりやすいのですが、"Selection.End(xlDown).Select"は、最初に見つかった空白セルの手前のセルを選択します。
サンプルの表のように途中で空白セルが含まれるとその手前のセルで止まってしまうため、最終行までたどり着きません。
A1セルを選択した状態で"Selection.End(xlDown).Select"を繰り返すと、表の最終行を選択した後は、ワークシートの最終行である"A1048576"が選択されます。
つまりワークシートの最終行を選択する直前に選択したセルが表の最後の行であることを示しています。
もちろんこの表のA列に余計なデータ、例えば表の説明をする文章などが入っていたりするとこの法則は崩れてしまうので注意が必要です。
最終行までデータが入っていた場合を考慮に入れたVBAのサンプルプログラム
可能性としてほとんどないとは思いますが、もしExcelの最終行までデータがびっしり入っていた場合を考慮するのであれば、サンプルプログラム"Sample02"を少し変更する必要があります。
Sub Sample03()
Dim lngRow As Long, rng As Range
Range("a1").Select
Do Until Selection.Row = "1048576"
lngRow = Selection.Row
Set rng = Selection
Selection.End(xlDown).Select
Loop
'ワークシートの最終行のデータ有無をチェック
If Len(Selection.Value) = 0 Then
rng.Select
MsgBox lngRow
Else
MsgBox 1048576
End If
End Sub
セルを選択する際の画面描画を止める処理を追加したVBAのサンプルプログラム
サンプルプログラムを実行するとわかると思いますが、セルを選択する処理が繰り返し実行されるため、そのたびに画面がスクロールします。
ちょっとかっこ悪いですし、画面描画を止めることで処理速度を上げることができますので、"Sample03"に画面描画を止める処理を追加したサンプルプログラムです。
Sub Sample04()
Dim lngRow As Long, rng As Range
'画面描画を処理が終了するまで停止
Application.ScreenUpdating = False
Range("a1").Select
Do Until Selection.Row = "1048576"
lngRow = Selection.Row
Set rng = Selection
Selection.End(xlDown).Select
Loop
If Len(Selection.Value) = 0 Then
rng.Select
MsgBox lngRow
Else
MsgBox 1048576
End If
End Sub
表の最終行のセルの選択や行番号を取得するVBAののサンプルプログラムまとめ
データが入ってる列の最後のデータが入力されているセルの選択には、"Selection.End(xlDown).Select"が使用できますが、表の途中で空白セルや空行が入っていると"Selection.End(xlDown).Select"では間違った場所を最後の行として選択してしまいます。
そういった場合でも対応できるようなVBAのサンプルプログラムを紹介しました。
ExcelのVBAを使用したセルの選択方法については、以下の記事でも紹介していますので参照してください。
コメント