ExcelのVBAにて、表の全行に対して処理を行いたい場合など、データが入力されている行の最終行を求めたい場合が、よくあるかと思います。
例えばこのような表で、最終行「11」を求める方法を、説明します。

結論
Sheets("Sheet1").Range(“A” & Rows.Count).End(xlUp).Row
または
Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
解説
一体何をしているのか、順に説明します。
Range または Cells の部分
Excelのセルの位置を表します。よくわからない方は、以下の記事をご覧ください。
また、セルを扱う場合は、上記のSheets(“Sheet1”)のように、シート名を必ず指定するクセをつけて下さい。
ブック内に複数のシートが存在する場合に、正しく動かなくなります。
Rows.Count の部分
これは、Excelシートの最大行を表します。
つまり、Excel2007以降(拡張子が.xlsx)の場合は「1048576」、Excel97-2003形式(拡張子が.xls)の場合は「65536」です。
End(xlUp) の部分
これは、キーボードの [CTRL]キー + [↑]キーを押した状態を表します。
Endの部分が[CTRL]キー、(xlUp)の部分が[↑]キーに対応しています。
つまり、セル[A1048576](Excel97-2003形式の場合はセル[A65536])を選択した状態で、[CTRL]キー + [↑]キーを押すということです。
すると、何が起きるかと言うと、



セル[A11]にジャンプしました。
これはExcelの機能ですが、[Ctrl]キーを押しながら矢印(↑↓←→のいずれか)のキーを押すことで、データが入力されているセルまでジャンプできます。
Row の部分
対象のセルの行番号を取得します。 上記の例ですと、セル[A11]の行番号、つまり「11」を求めることができます。
例
今回はあくまで、「最終行を求める」だけのサンプルとして、行番号をメッセージボックスに表示してみます。
Sub text()
MsgBox Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
End Sub


無事、「11」が表示されました。
注意点
この方法で、最終行を正しく求められない場合があります。
それは、オートフィルタなどで非表示になっている行がある場合です。
このような場合は、「表示されているセルにおける最終行」が、実行結果となります。
例えば、上記の表でこのような状態になっている場合

データは11行目まで入力されていますが、オートフィルタにより10行目と11行目が非表示になっているため、先ほどの
Cells(Rows.Count, 1).End(xlUp).Row
の実行結果は、「11」ではなく「9」になります。
「11」を求めたい場合は、オートフィルタの解除などで、全ての行を表示してから、上記の方法を使う必要があります。
オートフィルタの解除方法は、別の機会に説明したいと思います。
コメント