VBAのCellsはデフォルトで縦横全てのセルを取得しましたが、Rowsは横一行を取得します。Rows単体では使いにくそうですが、データの最終行処理で頻出です。これはもうVBAのパターンなので、どこかに書いて保存しておいた方がいいかも。
VBAのRowsでデータの最終行を取得する
VBAで最終行を得る時、基準のセルから、「下に」最終行を探すか「上に」最終行を探すかで結果が異なる場合があります。原因は空行にあります。空行がある場合は「下に」探したのでは不十分な最終行になってしまいます。
そこで「上に」探すことが必要です、Rowsオブジェクトを使用します。
1.Rowsオブジェクトとは
Rows(Index)で、行一列を取得します。今回の処理では、ワークシート全体のRowオブジェクトの数を数えるために使用します。上位オブジェクトにはWorksheetかRangeオブジェクトを指定できます。省略した場合はActiveSheetが補完されます。
2.最終行を得る(下に検索)
「Ctrl+↓」でデータの最終行に移動できるのは知っていますでしょうか。その操作のマクロ記録が以下になります。
サンプルデータはこちらです。
「Ctrl+↓」を押した画像はこちらです。
コード記録されたVBAがこちらです。
Sub Macro1()
‘
‘ Macro1 Macro
‘
‘
Selection.End(xlDown).Select
End Sub
Selection.End(xlDown).Select
End Sub
3.データの最終行(上に検索)
VBAのコードを見てすぐ分かる人はいませんが、実はEndキーワードが検索をするプロパティです。引数が検索をする方向になります。xlUp, xlDown, xlToRight, xlToLeftが指定できます。
Endの上位オブジェクトが検索の基準になるセルです。つまりA1から検索するのではなくA列のシートの最終行から「上に」検索することで最終行を得ます。
最終行はCells.Rows.Countで取得します。
Sub Macro1()
‘
‘ Macro1 Macro
‘
‘
Cells(Cells.Rows.Count, 1).End(xlUp).Select
End Sub
Cells(Cells.Rows.Count, 1).End(xlUp).Select
End Sub
修正するとこうなります。実行した画像は以下になります。
EndプロパティはVBAのRangeオブジェクトを返しますので、Range.RowでRangeオブジェクトの行数を得ることが出来ます。
Sub Macro1()
‘
‘ Macro1 Macro
‘
‘
MsgBox Cells(Cells.Rows.Count, 1).End(xlUp).Row
End Sub
MsgBox Cells(Cells.Rows.Count, 1).End(xlUp).Row
End Sub
実行した画像は以下になります。
今回はRowsオブジェクトの解説をしました。
この最終行を得る処理は結構使うので、自分でFunction化して保存しておくと便利です。
頻出の処理をまとめてライブラリ化するのも大切です。