VBAで最終行を取得する方法と そこからできること|Excel VBA

2018/05/27


Excel VBAで データの入っている最終行を取得する。

VBAでプログラミングしていると、Excelシート上で データの入った最終行の行番号を取得する必要に迫られることが多々あります。
VBA 最終行」といったキーワードでサイト検索してみると、いろいろなパターンで最終行を求める手法が紹介されていますね。

今回の h1r0-style.net では最もシンプルにデータの入った最終行を取得する方法と、最終行の行番号を取得できたことによって可能になるいくつかのことを紹介します。

「VBAで最終行が取得できない」という方はもちろん、方法をご存知の方も、もしかすると目からウロコなテクニックに出会うかもしれません。

VBAで最終行を取得する方法

Excelのデータベースに新たなレコード(行)を追加登録するときなど、データが入力されている「最終行」の行番号を取得したい状況はよくあることです。

VBAで最終行を取得する方法をステップ・バイ・ステップで述べていきます。


Excelシートの最大行数

データが入力されている最終行を求める前に、そもそもExcelシートの行は何行あるのでしょうか?
実はExcelのバージョンによって最大行数は違うのです。

Excel2003: 65,536行
Excel2007 2010 2013 2016: 1,048,576行

Excelは2003から2007にバージョンアップする際に大幅に最大行数と列数を増やしました。
これによってExcelはデータベースとしての容量をパワーアップしました。

VBAで最終行を取得するコード

お待たせしました。では、最終行を求めるVBAのコードを紹介します;

Cells(Rows.Count, 1).End(xlUp).Row

このコードの意味するところは、赤字の Rows.Count の部分が Excelシート全体の行数を表します。
つまり、Excel2003であれば 65,536行、Excel2007以上であれば 1,048,576行ということです。

Cells(Rows.Count, 1) はつまり、A列の最終行のセルを指します。A65536 あるいは A1048576 です。

ここからEndモードで一気にデータが入っている行まで上にジャンプするのが .End(xlUp)ということ。
最後の .Row が「そのセルの行」という意味で、つまり データの入力されている最終行 ということになります。

理屈を理解するのが面倒な方は、コードだけ覚えておけばひとまず目の前の課題は解決ですね。

変数に最終行を代入する実践的使用例

ではここで VBAの使用例を紹介します。
下のような Excelシートがあったとします。

上の表でデータの入っている最終行をVBAを使って求めます。

Option Explicit


'*********************************************************
'   データ最終行の取得  Get_LASTROW
'*********************************************************
Sub Get_LASTROW()
  Dim LASTROW As Long

  ' 最終行の取得
  LASTROW = Cells(Rows.Count, 1).End(xlUp).Row

  MsgBox LASTROW & " 行目が最終行です。"
End Sub
'-----------------<< End of Source >>------------------

上のサンプルは、LASTROW という変数に、データの最終行番号を代入してメッセージボックスに表示するコードです。

このマクロを実行すると;
このように「7行目」と正しく最終行を返します。


最終行を取得してできること

つぎは、VBAを使ってデータの入力された最終行の行番号を得たことによって「できること」をいくつか紹介します。

VBAで最終行までセル範囲を選択する

データエリア、つまり データの先頭行から最終行までを選択する コードです。
データ量が流動的なデータベースの場合、行数に固定値を入れるわけにはいきません。

でも、もう安心。
さきほどのコードを応用すればいつでも的確にデータエリアを選択することが可能です。
使用する Excelシートは「変数に代入する実践的使用例」で使用したものと同じとします。

この場合のコードはこうなります;

Option Explicit


'*********************************************************
'   データ最終行の取得  Get_LASTROW
'*********************************************************
Sub Get_LASTROW()
  Dim LASTROW As Long

  ' 最終行の取得
  LASTROW = Cells(Rows.Count, 1).End(xlUp).Row

  Range(Cells(3, 1), Cells(LASTROW, 4)).Select
End Sub
'-----------------<< End of Source >>------------------

▲赤字の部分がデータエリア、データの先頭行から最終行までを選択するコード

これを実行すると;

上のように、セルA3 からセルD7 までを選択します。


VBA 最終行の次の行を選択する

つぎは、最終行の次の行を選択する コードです。
新規レコードを新たに追加登録する場合などは、最終行のひとつ下の行を選択する必要があります。

この記事をここまで読んでくださるような方は、ここまで書けばすべて把握できているかとは思いますが、一つ前の項目で使用したコードに手を加えたサンプルをお見せします。

Option Explicit


'*********************************************************
'   データ最終行の取得  Get_LASTROW
'*********************************************************
Sub Get_LASTROW()
  Dim LASTROW As Long

  ' 最終行の取得
  LASTROW = Cells(Rows.Count, 1).End(xlUp).Row

  Cells(LASTROW + 1, 1).Select
End Sub
'-----------------<< End of Source >>------------------

▲ここも赤字部分が 最終行の次の行を選択するサンプルです。

LASTROW + 1 ってところがミソです。

VBA 最終行を削除する

つぎは、最終行の削除 です。
例えば新規データを先頭行に挿入して、最終行(一番古いレコード)削除する、といった場合に使用します。

これも先ほどのコードを応用してサンプルを作成します。

Option Explicit


'*********************************************************
'   データ最終行の取得  Get_LASTROW
'*********************************************************
Sub Get_LASTROW()
  Dim LASTROW As Long

  ' 最終行の取得
  LASTROW = Cells(Rows.Count, 1).End(xlUp).Row

  Rows(LASTROW).Delete Shift:=xlUp
End Sub
'-----------------<< End of Source >>------------------

▲このコードを実行すると、サンプルシートの7行目「小林 浩司」の行が削除されます。


VBAで最終行を取得できないという方へ

「最終行を取得できない」という方は、Excelシートのデータエリアの「列」をあらためてチェックしてみてはいかがでしょうか。

例えば 下のようなシートの場合、データエリアはA列ではなくB列から始まっています。

それなのに、Cells(Rows.Count, 1).End(xlUp).Row と、コードを書いても動きません。
赤字で書いた「1」は A列を指しています。
B列をチェックさせたいのならば、Cells(Rows.Count, 2).End(xlUp).Row と書かなければいけません。

以上、Excel VBAで データの入っている最終行を取得する でした。

関連記事



併せて読んでおくとさらに便利

VBA [ファイルを開く] ダイアログボックスを表示させる|EXCEL VBA
VBA・ダイアログボックス
VBAで [ファイルを開く] ダイアログ ボックスを表示させ、選択したファイル名をテキストボックスに表示させるまでを解説。GetOpenFilenameメソッドを、使用例もサンプルコードを公開しています。

VBA「フォルダ選択」ダイアログを表示させる|Excel VBA
VBA・ダイアログボックス
VBAを使い、ファイルではなく「フォルダ選択」をさせる ダイアログボックス を表示させ、ユーザーが選択した フォルダ名 を含むPathを テキストボックスに表示させる方法について解説。

VBA フォルダ内のファイル名一覧の取得|EXCEL VBA
VBA・一覧取得
VBAでフォルダ内のファイル名の一覧を取得する方法を解説。フォルダの中の複数ファイルを自動でひとつずつ展開しながら 連続処理をさせたいときに使える超便利テク!

VBAで空白行を削除する方法|Excel VBA 高速技
VBA・Unionメソッド
VBAを使って空白行の削除方法を解説します。Unionメソッド を使用して空白行を高速で一括削除する方法をサンプルコード付きで解説。ぜひ参考にしてください。

VBA カレントフォルダの取得と設定・変更|Excel VBA
VBA・CurDir関数
VBAで カレントフォルダ名 を取得したり、設定(指定)したり変更(移動)したりする方法について解説します。CurDir関数 や ChDirステートメント などの使い方についても触れています。

HLOOKUP関数とVLOOKUP関数の違いと使い方
HLOOKUP関数・VLOOKUP関数
「HLOOKUP関数」をご存知ですか? HLOOKUPとVLOOKUPとの違いについて解説します。HLOOKUPを使った複数条件に合致するデータの抽出方法や、HLOOKUPの[#N/A]エラーを非表示にする方法などなど。

※その他関連記事は、このページの下の方にもあります。

-EXCEL&VBA
-,

シェアしていただけると助かります。