カテゴリ: Excel VBA 更新日: 2026/04/08

VBAで最終行・最終列を自動取得!FindとEndを使った実用パターン徹底解説

最終行・最終列を取得する方法(Find/Endを使った実用パターン)
最終行・最終列を取得する方法(Find/Endを使った実用パターン)

先生と生徒の会話形式で理解しよう

生徒

「エクセルでデータがどこまで入力されているか、一番下の行を自動で見つける方法はありますか?毎日データの行数が変わるので困っています。」

先生

「それこそVBAの得意分野ですよ。プログラムが自動で『データの終わり』を見つけてくれれば、どんなに長い表でも一瞬で処理できます。」

生徒

「具体的にはどうやって探すんですか?」

先生

「主に End を使う方法と Find を使う方法があります。それぞれの特徴を一緒に見ていきましょう!」

1. 最終行・最終列を取得する重要性とは?

1. 最終行・最終列を取得する重要性とは?
1. 最終行・最終列を取得する重要性とは?

Excel VBA(エクセル・ブイビーエー)を使って自動化を行う際、最も重要なことの一つが「データの範囲を正確に把握すること」です。例えば、100行目までデータがある表に対して、もし50行目までしか処理をしなければ、残りの半分は放置されてしまいます。逆に、データがない場所にまで処理をかけようとすると、無駄な時間がかかったりエラーの原因になったりします。

パソコンを触ったことがない方でも、エクセルのシートが広大なマス目の集まりであることを想像してみてください。その中で、どこに文字が書いてあるのかを人間が毎回確認するのではなく、プログラムに「一番端っこを探して!」と命令を出すのが、最終行や最終列の取得です。これをマスターすると、毎日増えたり減ったりする売上データや名簿の管理が、驚くほど楽になります。

2. 定番のEndプロパティで最終行を取得する

2. 定番のEndプロパティで最終行を取得する
2. 定番のEndプロパティで最終行を取得する

最もよく使われるのが、End(エンド) プロパティを使う方法です。これは、エクセルで「Ctrlキー」を押しながら「矢印キー」を押したときの動きと同じです。一番下からジャンプして、最初にぶつかったデータがある行を「最終行」として認識します。

具体的には、シートの一番下の行(1048576行目)から上に向かってジャンプする命令を書きます。なぜ上から下ではなく、下から上へ行くのでしょうか。それは、もし表の途中に空欄があった場合、上から行くとそこで止まってしまうからです。一番下から出発すれば、確実に「一番最後に入力されたデータ」にたどり着くことができます。


Sub GetLastRowEnd()
    Dim lastRow As Long
    
    ' A列の最終行を取得します
    ' Rows.Countは最大行数、xlUpは「上へジャンプ」という意味です
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    ' 見つけた行番号を画面に表示します
    MsgBox "A列の最終行は " & lastRow & " 行目です。"
End Sub

3. 同様の方法で最終列を取得するテクニック

3. 同様の方法で最終列を取得するテクニック
3. 同様の方法で最終列を取得するテクニック

行だけでなく「列」についても同様の方法で探すことができます。横方向の一番端、つまり最終列を見つけるには、シートの一番右側(XFD列)から左に向かってジャンプします。列を指定する際は、xlToLeft という言葉を使います。

列番号も行番号と同じように数字で取得されるため、A列なら1、B列なら2として返ってきます。列の終わりが分かれば、「何項目まで入力されているか」を自動で判別できるようになります。これを応用すれば、表の大きさが縦に伸びても横に広がっても、常に全体を完璧にカバーするプログラムが作れるようになります。


Sub GetLastColumnEnd()
    Dim lastCol As Long
    
    ' 1行目の最終列を取得します
    ' Columns.Countは最大列数、xlToLeftは「左へジャンプ」という意味です
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
    
    ' 見つけた列番号を表示します
    MsgBox "1行目の最終列は " & lastCol & " 列目です。"
End Sub

4. 空白があっても大丈夫!Findメソッドの凄さ

4. 空白があっても大丈夫!Findメソッドの凄さ
4. 空白があっても大丈夫!Findメソッドの凄さ

次に紹介するのが、Find(ファインド) メソッドを使う方法です。これは、エクセルの「検索」機能を使って最終地点を探す、より強力なテクニックです。End プロパティは特定の行や列に絞って探しますが、Find を使えば「シート全体のどこかに書かれた一番端」を探し出すことができます。

例えば、表の形が複雑で、どこに最後のデータがあるか予測しづらい場合に Find は非常に役立ちます。また、一部のセルが非表示になっていたり、数式が入っていて見た目だけ空欄だったりする場合でも、より正確に「本当の最後」を見つけてくれる頼もしい味方です。この方法は少しコードが長くなりますが、どんな表でも対応できる「プロ仕様」の書き方と言えます。


Sub GetLastByFind()
    Dim lastRow As Long
    
    ' シート全体を検索して、最後に入力がある行を探します
    ' *(アスタリスク)は何でもいいから文字が入っている場所、という意味です
    On Error Resume Next
    lastRow = Cells.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    On Error GoTo 0
    
    If lastRow > 0 Then
        MsgBox "シート全体の最終行は " & lastRow & " 行目です。"
    Else
        MsgBox "データが見つかりませんでした。"
    End If
End Sub

5. 変数(Long型)を使ってデータを保持する理由

5. 変数(Long型)を使ってデータを保持する理由
5. 変数(Long型)を使ってデータを保持する理由

ここで少し用語の解説をします。コードの中で使っている Dim lastRow As Long という部分は、「これから lastRow という名前の箱(変数)を使いますよ。中には長い数字を入れます」という宣言です。

プログラミング未経験の方は「なぜ数字なのに Integer ではなく Long なの?」と思うかもしれません。実は Integer(整数型)という箱は、約3万件までの数字しか入りません。一方、エクセルの行数は100万件を超えています。そのため、大きな数字を扱える Long(長整数型)を使うのがVBAのルールです。最初から Long を使う癖をつけておけば、データが大量になったときでもエラーで止まる心配がなく、安心して自動化を進めることができます。

6. 最終行を使って繰り返し処理(For文)と繋げる

6. 最終行を使って繰り返し処理(For文)と繋げる
6. 最終行を使って繰り返し処理(For文)と繋げる

最終行を取得する一番の目的は、その行数分だけ同じ作業を繰り返すことにあります。ここで登場するのが For(フォー) 文です。「2行目から最終行まで、一つずつ順番に処理してね」と命令を出します。

例えば、1,000行ある名簿の備考欄に「確認済み」と入力する場合、最終行を自動で取得できれば、件数が変わってもコードを書き換える必要はありません。これが「汎用性の高い(どんな時でも使える)プログラム」の正体です。一つ一つの作業は単純でも、それを正確に最後までやり遂げる力は、パソコンならではの強みです。以下のコードは、最終行までのすべての行を処理する基本的な形です。


Sub LoopToLastRow()
    Dim lastRow As Long
    Dim i As Long
    
    ' 最終行を取得
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    ' 2行目(見出しの次)から最終行まで繰り返します
    For i = 2 To lastRow
        ' 2列目(B列)に「処理完了」と書きます
        Cells(i, 2).Value = "処理完了"
    Next i
    
    MsgBox "すべての処理が終わりました!"
End Sub

7. 非表示の行や列に潜むトラップに注意

7. 非表示の行や列に潜むトラップに注意
7. 非表示の行や列に潜むトラップに注意

実務でVBAを使うときに注意したいのが「非表示のセル」です。実は、End(xlUp) を使った方法は、非表示になっている行であっても関係なく見つけてくれます。しかし、フィルターをかけている最中などは、目に見えている最終行と、プログラムが取得した最終行が食い違うことがあります。

「見た目通りに動かない」というのは、初心者が最もパニックになりやすいポイントです。そのため、マクロを動かす前にはフィルターを解除する命令を入れたり、必要に応じて Find メソッドと使い分けたりすることが推奨されます。プログラムは指示されたことには忠実ですが、人間のように「空気を読んで目に見えるところだけやる」という器用さは持っていません。その特性を理解して、正確な指示を出してあげましょう。

8. 実用パターン:新しいデータを末尾に追加する

8. 実用パターン:新しいデータを末尾に追加する
8. 実用パターン:新しいデータを末尾に追加する

最終行の取得が最も輝く瞬間は、既存のデータの「すぐ下」に新しい情報を追加したいときです。売上管理などで、どんどん下に記録を足していくような作業ですね。

この場合、取得した「最終行」に 1 を足せば、「次に書き込むべき空の行」が分かります。Cells(lastRow + 1, 1) という書き方です。これを使えば、誰がいつどんな順序でデータを入力したとしても、プログラムは常に一番下の綺麗な場所に情報を追記してくれます。手動で一番下までスクロールして、空いている場所を探してクリックする…そんな面倒な作業とは今日でおさらばです。

9. 複数のシートを跨いで最終行を探す方法

9. 複数のシートを跨いで最終行を探す方法
9. 複数のシートを跨いで最終行を探す方法

最後に、より高度な操作について触れておきます。一つのシートだけでなく、別のシートの最終行を取得したい場合です。このときは必ず Worksheets("シート名") を命令の前に付けましょう。

もしシート名を指定し忘れると、VBAは今たまたま開いているシートの中で端っこを探してしまいます。これは「自分は寝室で探し物をしているつもりなのに、実はリビングを漁っている」ようなものです。対象をはっきりさせることで、ミスなく確実に目的の場所へたどり着けます。プログラミングの基本は「誰に」「何を」「どうするか」を丁寧に説明すること。この基本を忘れなければ、VBAの習得はすぐそこです!

カテゴリの一覧へ
新着記事
New1
Excel VBA
VBAの基本構造を理解しよう!モジュール・プロシージャ・関数の役割まとめ
New2
Office Scripts
Office Scriptsで大量シートを効率管理!Excelワークブック最適構造と自動化テクニック
New3
Excel VBA
Excel VBAが今でも使われ続ける理由とは?現場で評価されるポイントを徹底解説
New4
Excel VBA
VBAのIf文の使い方を完全ガイド!初心者でもわかる条件分岐
人気記事
No.1
Java&Spring記事人気No1
Office Scripts
Office Scriptsで別ブックを開いてデータ取得する方法|OneDrive・SharePoint連携でExcel自動化
No.2
Java&Spring記事人気No2
Excel VBA
Excel VBA参照設定エラー「参照が見つかりません」を完全解説!初心者でも原因と対処法がわかる
No.3
Java&Spring記事人気No3
Excel VBA
個人用マクロブック(PERSONAL.XLSB)で作る最強の共通ライブラリ化ガイド
No.4
Java&Spring記事人気No4
Excel VBA
Excel VBAの開発環境を最速で整える!VBEの開き方から基本操作まで完全ガイド
No.5
Java&Spring記事人気No5
Excel VBA
Excel VBAは今後なくなる?将来性と企業での活用状況を詳しく解説
No.6
Java&Spring記事人気No6
Excel VBA
VBAのコメントの書き方を完全ガイド!初心者でもわかる説明文の付け方
No.7
Java&Spring記事人気No7
Excel VBA
Excel VBAのブレークポイント設定と使い方!初心者でも理解できるデバッグの基本
No.8
Java&Spring記事人気No8
Excel VBA
Excel VBAモジュール共有術!複数のブックでマクロを使い回す最適構成