【VBA】最終行を取得する方法~Count関数の使い方をサンプル事例を使って解説~
1行目から最終行までの数値を集計したい。1行目から最終行までの範囲を罫線で囲いたい。
こんな処理は最終行を取得するVBAを使って自動化できます。
日々変化するデータを効率的に処理するには、最終行の取得が必須のスキルです。
「最終行が取得できない」「エラーが発生する」といった悩みを抱える方も多いのではないでしょうか?
最終行の取得には複数の方法があり、状況に応じて最適な手法を選ぶことでこれらの問題を解決できます。
本記事では、
Count関数を中心とした最終行取得の基本から大規模データ処理における実践的なテクニックまでサンプルコードや図を交えて徹底解説
します。
本記事をエクセル業務の効率アップに役立ててみてください。
目次
VBAで最終行を取得する基本的な方法
日々変化するデータを処理するには、最終行の取得が絶対に欠かせません。
『最終行を取得するVBA』ではデータの範囲を正確に把握すること重要です。
最終行を取得する方法はいくつかありますが、本記事ではCount関数を活用した方法を中心に詳しく解説していきます。
Count関数とは?初心者でもわかる基礎知識
Count関数は、指定した範囲内のセルの数を数える便利な関数です。
Worksheetオブジェクトのプロパティとして使用することで、最終行を取得することが可能。
A列の最終行をメッセージボックスで表示する
という事例を使ってCount関数による最終行の取得VBAを解説していきます。
サンプル事例はこんな感じ
A列の最終行を取得するサンプルコードがこちら
Sub GetLastRow()
Dim LastRow As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "最終行は " & LastRow & " 行目です"
End Sub
3行目のコードは、変数LastRowに1列目の最終行の数値を格納するという意味です。
実行結果がこちら

ガッツポーズの人
Cells.Countを使った最終行の取得方法
Cells.Countは、ワークシート全体のセル数を取得できる非常に便利なプロパティです。
特定の列における最終行を取得する場合、このプロパティと組み合わせることで効率的なコードに仕上げることができます。
先程同様、A列の最終行をメッセージボックスで表示する
という事例を使ってCells.Countの使い方を解説していきます。
サンプルコードはこちら
Sub GetLastRowWithCellsCount()
Dim LastRow As Long
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
MsgBox "最終行は " & LastRow & " 行目です"
End Sub
3行目から5行目のコードは、With構文を使ってActiveSheetを指定する
4行目のコードは、変数LastRowにA列の最終行を格納する
という意味です。
実行結果はこちら
End(xlDown)メソッドによる最終行の取得方法
End(xlDown)メソッドは、
現在のセルから指定した方向に向かって、データが存在する最後のセルまで移動する機能
です。
このメソッドは、連続したデータ範囲の最終行を取得する場合に効果的です。
ただし、データの途中に空白行がある場合はそこで処理が止まってしまうので注意が必要。
先程同様、A列の最終行をメッセージボックスで表示する
という事例を使ってCells.Countの使い方を解説していきます。
サンプル事例はこんな感じ
7行目と8行目を空欄にし9行目に適当なテキストを入力しています。
サンプルコードがこちら
Sub GetLastRowWithEndXlDown()
Dim LastRow As Long
LastRow = Range("A1").End(xlDown).Row
MsgBox "連続データの最終行: " & LastRow
End Sub
3行目のコードは、End(xlDown)メソッドを使って変数LastRowに最終行を格納するという意味です。
実行結果がこちら
UsedRangeプロパティを使用した取得方法
UsedRangeプロパティは、
ワークシート上で使用されているセル範囲全体を取得できる機能
です。
大量のデータを扱う場合や、複数の列にまたがるデータを処理する際に使われます。
日々情報量が変化する一覧表の最終行を取得する
という事例を使ってUsedRangeプロパティの使い方を解説していきます。
こんな感じ
「連絡先」が多く入力され、他の「会社名」「氏名」は中途半端に入力された状態です。
サンプルコードがこちら
Sub GetLastRowWithUsedRange()
Dim LastRow As Long
LastRow = ActiveSheet.UsedRange.Rows.Count
Debug.Print "使用範囲の最終行: " & LastRow
End Sub
3行目のコードは、編集中のシートで最終行を変数LastRowに格納するという意味です。
実行結果がこちら

ガッツポーズの人
『最終行を取得するVBA』でどんなことができるの?
『最終行を取得するVBA』でできることは、
日々変化する一覧表の最終行の最新情報を取得することができる!誰かが行を追加したり、削除したりしても常に最新の情報を取得できる
ということです。
「えーー!!データが付け加えられているの知りませんでした。。。」
なんて失敗を完全に防ぐことができます。
具体的にどんなことができるのかサンプル事例を使ってご紹介します。
サンプル事例① 別シートの情報を集約して一覧表を作成するマクロ
最終行を取得するVBAを使えば、
シート別で管理されている一覧表を1つのシートに集約
することができます。

ガッツポーズの人
関連記事「進捗情報管理表作成VBA」では、
最終行を取得するVBAを使って別シートの情報を転記するVBAの使い方
が紹介されています。
仕事でかなり使われるマクロなので是非チェックしてみてください。
サンプル事例② 一覧表の罫線を引くマクロ
『最終行を取得するVBA』を使えば、
変動する一覧表の罫線を常に整った状態
に保つことができます。
こんな感じ
行や列の挿入で一覧表の場所が移動しても問題ありません。
一覧表の左上の項目(下図のサンプルでは「日付」というテキスト)で一覧表の場所を検索し、罫線を引くことができます。
こんな感じ

ガッツポーズの人
関連記事「一覧表の罫線表示を自動化するマクロ」では、
最終行を取得するVBAでどんな状況でもキレイな罫線を引く方法
が紹介されています。
キレイな資料作りを自動化したい!という方は是非チェックしてみてください。
『最終行を取得するVBA』の導入でよく発生するエラーと対処法
『最終行を取得するVBA』を導入する際、思いがけないエラーが発生することがあります。
頑張って作成したコードが途中で止まってしまうと、
なぜエラーが発生するのだろう。。。最終行の情報はしっかり取得できているのかな。。。
なんて不安に感じますよね。
ですが、心配することはありません。
適切な対処方法を知っておくことでエラーの発生を防ぎ安定したコードに仕上げる
ことが可能です。
特に大規模なデータを扱うコードではエラー処理がとても重要なので、ここからは実務でよく遭遇するエラーとその解決方法について説明します。
データが空の場合の対処方法
シートにデータが存在しない場合、エラーが発生する可能性が高くなります。
このような状況に備えて、適切なエラー処理を実装することが重要です。
以下のサンプルコードは、
データが空の場合でも安全に動作する事例
です。
Sub HandleEmptySheet()
Dim LastRow As Long
On Error Resume Next
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
If Err.Number <> 0 Or LastRow = 1 Then
MsgBox "データが存在しません"
Exit Sub
End If
Debug.Print "最終行: " & LastRow
End Sub
3行目のコードは、エラーが発生しても次のステートメントから処理を継続する。
5行目のコードは、エラーが発生したとき、または最終行が1のとき(A列にテキストが存在しないとき)にメッセージを表示する。
という意味です。
上記のサンプルコードをあらかじめ設定しておけば、エラーが発生した場合でもメッセージで知らせることができます。
非連続データがある場合の注意点
データの途中に空白行がある場合、単純なEnd(xlDown)メソッドでは正確な最終行を取得できません。
非連続データに対応できるサンプルコードがこちら
Sub HandleNonContiguousData()
Dim LastRow As Long
Dim rng As Range
Set rng = Range("A:A").SpecialCells(xlCellTypeConstants)
LastRow = rng.Cells(rng.Cells.Count).Row
Debug.Print "非連続データの最終行: " & LastRow
End Sub
4行目のコードは、A列を範囲指定する。(ただしSpecialCellsメソッドで定数の入っているセルを限定する)
5行目のコードは、A列の範囲で定数の入ったセルの最終行を変数LastRowに格納する。
という意味です。
SpecialCellsメソッドの性能を利用して、途中にある空白セルを検知しています。
エラー発生時のデバッグ方法
エラーが発生した際の原因特定と解決は、プログラミングにおいて重要なスキルです。
VBAには便利なデバッグ機能が備わっており、これを活用することで効率的にエラーを解決できます。
効率的にデバックができるサンプルコードがこちら
Sub DebugLastRowProcess()
Dim LastRow As Long
On Error GoTo ErrorHandler
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "処理成功: 最終行 = " & LastRow
Exit Sub
ErrorHandler:
Debug.Print "エラー番号: " & Err.Number
Debug.Print "エラー内容: " & Err.Description
End Sub
3行目のコードは、エラーが発生した場合ErrorHandler:に移動する。
9行目から11行目のコードは、発生したエラー番号とエラー内容を表示する。
という意味です。
関連記事「初心者でもできるデバックのやり方」では効率的なデバック方法が解説されています。
よくエラーが発生して困っている!エラー原因が良く分からなくて困っている!
という方は是非参考にしてみてください。
実践的な『最終行を取得するVBA』のサンプルコード3選
実務では、
複雑な条件や要件に対応するため処理速度が速くやメンテナンスのしやすいコード
が求められます。
ここからは『最終行を取得するVBA』を使った実践的なサンプルコードを紹介します。
「使えるなぁ。。。」と感じたサンプルコードをコピペして活用してみてください。
シート内の特定列の最終行を取得する方法
空白セルをチェックしつつ特定の列の最終行を取得するサンプルコードがこちら
Function GetLastRowInColumn(ws As Worksheet, columnNumber As Long) As Long
Dim LastRow As Long
With ws
'通常の方法で最終行を取得
LastRow = .Cells(.Rows.Count, columnNumber).End(xlUp).Row
'空白セルが含まれているかチェック
If WorksheetFunction.CountA(.Range(.Cells(LastRow + 1, columnNumber), .Cells(LastRow + 100, columnNumber))) > 0 Then
LastRow = .Cells(.Rows.Count, columnNumber).End(xlUp).Row
End If
End With
GetLastRowInColumn = LastRow
End Function
5行目のコードは、変数LastRowに特定の列の最終行を格納する
8行目から11行目のコードは、5行目で取得した最終行から+100行の範囲で値が入力されたセルがないかチェックし該当するセルがあれば再度変数LastRowに格納する
という意味です。

ガッツポーズの人
複数シートの最終行を一括取得する方法
複数のシートにまたがるデータを処理する場合、効率的な方法で各シートの最終行を取得する必要があります。
ブック内の全シートの最終行を取得するサンプルコードがこちら
Sub GetLastRowsAllSheets()
Dim ws As Worksheet
Dim LastRowCollection As Collection
Set LastRowCollection = New Collection
For Each ws In ThisWorkbook.Worksheets
With ws
LastRowCollection.Add .Cells(.Rows.Count, 1).End(xlUp).Row, ws.Name
End With
Next ws
'結果の出力
For Each ws In ThisWorkbook.Worksheets
Debug.Print ws.Name & "の最終行: " & LastRowCollection(ws.Name)
Next ws
End Sub
6行目のコードは、ブック内全てのシートを繰り返す
8行目のコードは、各シートのA列の最終行を取得しLastRowCollectionに格納する
12行目のコードは、シート名からLastRowCollectionに格納された最終行の情報を表示する
という意味です。
各担当者がシート毎に編集作業を行って最終行に集計値を入力→その集計値をVBAを使って合算する
このような実務のときに活用されます。
関連記事「別シートから別氏シートへ情報を転記するVBA」では、
最終行を取得するVBAが使われたエクセルファイルをダウンロード
することができます。
エクセル業務でよく活用されるVBAなのでゲットして仕事の効率アップに役立ててください。
条件付きで最終行を取得する実践的なサンプルコード
特定の条件を満たすデータの最終行を取得することができれば、より複雑な処理ができいろんなエクセル業務に応用させることができます。
条件に基づいて最終行を取得するサンプルコードがこちら
Function GetLastRowWithCondition(ws As Worksheet, columnNumber As Long, criteria As String) As Long
Dim LastRow As Long
Dim rng As Range
With ws
'条件に合うセルを検索
Set rng = .Range(.Cells(1, columnNumber), .Cells(.Rows.Count, columnNumber)).Find( _
What:=criteria, _
LookIn:=xlValues, _
SearchDirection:=xlPrevious)
If Not rng Is Nothing Then
LastRow = rng.Row
Else
LastRow = 0 '条件に合うデータが見つからない場合
End If
End With
GetLastRowWithCondition = LastRow
End Function
7行目から10行目のコードは、1行目から最終行までの範囲でFindメソッドを使って指定する項目を検索
12行目から16行目のコードは、Findメソッドで指定する項目が検索できれば変数LastRowに最終行を格納し、検索できなければ変数LastRowに0を格納
という意味です。
効率的な『最終行を取得するVBA』の作り方
『最終行を取得するVBA』の設定では、
コードが動作するだけでなくパフォーマンスとメンテナンス性を考慮する
ことが重要です。
大規模なシステムや頻繁にデータが更新される環境では、効率的なコードが処理時間の短縮につながります。
ここからは、効率的なVBAコードの作り方を紹介します。
パフォーマンスを考慮した最終行取得の方法
大量のデータを処理する際は、パフォーマンスを意識したコード作りが大切です。
画面更新の制御や計算の最適化により、処理速度を大幅に向上させることができます。
パフォーマンスを重視したサンプルコードがこちら
Sub GetLastRowWithOptimizedPerformance()
Dim LastRow As Long
Dim StartTime As Double
StartTime = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ActiveSheet
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'データの処理
Range("A1:A" & LastRow).Value = Range("A1:A" & LastRow).Value
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Debug.Print "処理時間: " & Timer - StartTime & "秒"
End Sub
4行目のコードは、VBAを実行して処理完了までの時間を計測するためのタイマーを開始する
6行目のコードは、処理中の更新画面をOFFにする
7行目のコードは、エクセルの自動計算システムを手動に切り替える
16行目のコードは、手動にしたエクセルの自動計算システムを自動に戻す
17行目のコードは、OFFにした処理中の更新画面の設定をONに戻す
という意味です。
VBA実行中は不要なシステムの設定をOFFにすることで処理速度アップに繋がります。
大量データ処理時の推奨される実装方法
大量のデータを扱う場合、メモリ使用量と処理速度のバランスを考慮する必要があります。
配列を使用したデータ処理や効率的なループ処理によりパフォーマンスの高いコードに仕上げることが可能です。
大量のデータ処理に対応したサンプルコードがこちら
Sub ProcessLargeDataSet()
Dim LastRow As Long
Dim DataArray As Variant
With ActiveSheet
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
DataArray = .Range("A1:A" & LastRow).Value
'データをメモリ上で処理
Dim i As Long
For i = 1 To UBound(DataArray)
If Not IsEmpty(DataArray(i, 1)) Then
DataArray(i, 1) = ProcessData(DataArray(i, 1))
End If
Next i
'処理結果をシートに戻す
.Range("A1:A" & LastRow).Value = DataArray
End With
End Sub
5行目から19行目のコードは、With構文を宣言することで不要なオブジェクトの指定を省略する
10行目から15行目のコードは、配列を使って大量のデータを処理しメモリーを不要なメモリーを省略する
18行目のコードは、配列で格納してあった処理結果をシートに表示する
という意味です。
配列を使えば一つ一つの動作をメモリー内で処理することができるので効率的なコードに仕上げることができます。
コードの保守性を高めるための設計のポイント
VBAを複数の人が扱うエクセルファイルへ導入する場合、
エラーが発生せずメンテナンスのしやすいたコード設計
が必要になります。
VBA作成時に
適切な変数名の使用や、エラー処理の実装、コメントの追加
を意識してみてください。
コードの可読性と保守性が大幅にアップするはずです。
保守性を重視したサンプルコードがこちら
Option Explicit
'最終行取得の共通関数
Public Function GetLastRowWithErrorHandling(ByVal ws As Worksheet, _
Optional ByVal columnNumber As Long = 1) As Long
Const FIRST_ROW As Long = 1
Dim LastRow As Long
On Error GoTo ErrorHandler
'最終行を取得
With ws
LastRow = .Cells(.Rows.Count, columnNumber).End(xlUp).Row
'データの妥当性チェック
If LastRow < FIRST_ROW Then
LastRow = FIRST_ROW
End If
End With
GetLastRowWithErrorHandling = LastRow
Exit Function
ErrorHandler:
GetLastRowWithErrorHandling = FIRST_ROW
Debug.Print "エラー発生: " & Err.Description
End Function
9行目のコードは、エラーが発生した場合、24行目に飛んでエラー内容が表示される
16行目から18行目のコードは、値が入力されていないときは変数LastRowに1を格納しエラーの発生を防ぐ
という意味です。
処理毎にコメントを残すことで、メンテナンスのしやすい親切なコードになります。
『最終行を取得するVBA』の設定では、
パフォーマンス、データ処理の最適化、コードの保守性
という3つの要素を適切にバランスさせることが重要です。
これらの要素を考慮しながら、扱っているエクセルファイルに導入していってください。
思い通りのVBAを設定することができればエクセル業務の効率が格段にアップするはずです。
この記事を読んで、
「VBAやってみたい!」「いろんなエクセル業務の自動化に挑戦したい!!」
と感じてくれた方はエクセルVBAの情報を定期的に配信しているメルマガへの登録を検討してみてください。
エクセル業務で苦しんだ私の経験を元に、
実務で役立つVBA情報をお届けしています。
この記事が、あなたの業務効率化への第一歩となることを願っています。
ディスカッション
コメント一覧
まだ、コメントがありません