【Excel VBA】最終行を取得する方法|End(xlUp)・CurrentRegion・UsedRange・Findの違い

みなさんこんにちは。

Excel VBAでデータを繰り返し処理していると、データが入力されている最終行を取得したい場面も多いかと思います。

最終行の取得方法としてよく使用されるのがEnd(xlUp)ですが、VBAではCurrentRegionUsedRangeFindを使用して最終行を取得することもできます。

ただし、それぞれの方法には特徴があり、空白行がある場合や、値は入っていないけれど書式だけが設定されているセルがある場合など、シートの状態によって取得結果が変わることがあります。

そこで今回は、Excel VBAで最終行を取得する4つの方法について、それぞれの違いと注意点も含めてご紹介したいと思います。

この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • VBAプログラミング:初学者~初級者
  • Excel VBAで最終行を取得する方法を知りたい人
  • End(xlUp)以外の取得方法も知りたい人
  • CurrentRegion・UsedRange・Findの違いを知りたい人
  • 空白行や書式だけのセルがある場合の注意点を知りたい人

といったところでしょうか。

今回の記事を読むメリット

最終行の取得方法を使い分けられるようになると、次のようなメリットがあります。

  • データ件数が増減してもVBAで自動的に処理範囲を決められる
  • 途中に空白行があるデータでも用途に応じて取得方法を選べる
  • 表全体・指定列・シート全体など目的に合った最終行を取得できる

といったところでしょうか。

最終行の取得は、データ転記やCSV処理、一覧データのループ処理など、VBAでは非常によく使用する処理になるかと思います。

今回使用するサンプルデータ

今回はSheet1のA列に、以下のようなデータが入力されているものとして説明します。

A1:社員番号
A2:1001
A3:1002
A4:1003
A5:(空白)
A6:1004
A7:1005

途中に空白行を入れておくことで、各方法の違いも確認していきます。

Excel VBAで最終行取得を比較するための空白行を含むサンプルデータ

End(xlUp)で最終行を取得する方法

最終行を取得する方法として、最もよく使用されるのがEnd(xlUp)です。

シートの一番下から上方向へ移動し、最初に値が入力されているセルの行番号を取得します。

Sub GetLastRow_End()

    ' 最終行を取得する対象シートを格納する変数
    Dim ws As Worksheet

    ' 取得した最終行番号を格納する変数
    Dim lastRow As Long

    ' 最終行を取得するシートを指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' A列の一番下のセルから上方向へ検索し、
    ' 最初に値が入力されているセルの行番号を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 取得した最終行番号を確認
    MsgBox "A列の最終行は " & lastRow & " 行目です。"

End Sub

今回のサンプルデータでは、A7セルに「1005」が入力されていますので、最終行として7が取得されます。

Excel VBAのEnd xlUpを使用してA列の最終行を取得するコード画面

途中に空白行があっても取得できる

今回のサンプルではA5が空白ですが、A7に値が入力されていればEnd(xlUp)ではA7を取得できます。

一番下のセルから上方向へ検索するため、指定した列の途中に空白セルが存在していても問題ありません。

指定した列を基準にする点には注意

End(xlUp)で取得できるのは、あくまでも指定した列の最終行です。

例えばA列が7行目まででも、B列に10行目までデータがある場合、A列を指定したコードでは7行目が取得されます。

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

CurrentRegionは、指定したセルを含む連続したデータ範囲を取得する方法です。

表形式のデータ全体をまとめて扱いたい場合には便利ですが、完全な空白行や空白列がある場合には、そこで範囲が区切られます。

Sub GetLastRow_CurrentRegion()

    ' 最終行を取得する対象シートを格納する変数
    Dim ws As Worksheet

    ' CurrentRegionで取得した範囲を格納する変数
    Dim dataRange As Range

    ' 取得した最終行番号を格納する変数
    Dim lastRow As Long

    ' 対象となるシートを指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' A1セルを基準に、空白行・空白列で囲まれた
    ' 連続したデータ範囲を取得
    Set dataRange = ws.Range("A1").CurrentRegion

    ' CurrentRegionの開始行と行数から最終行番号を算出
    ' 開始行が1行目とは限らないため、
    ' Row + Rows.Count - 1 で最終行を取得
    lastRow = dataRange.Row + dataRange.Rows.Count - 1

    ' 取得した最終行番号を確認
    MsgBox "CurrentRegionの最終行は " & lastRow & " 行目です。"

End Sub

今回のサンプルではA5が空白行となっているため、A1を基準にしたCurrentRegionはA4までで区切られます。

Excel VBAのCurrentRegionを使用して連続したデータ範囲の最終行を取得するコード画面

データ途中に空白行や空白列が発生する可能性がある場合は、CurrentRegionを最終行取得に使用する際に注意してください。

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

UsedRangeは、ワークシート上で使用されている範囲を取得する方法です。

Sub GetLastRow_UsedRange()

    ' 最終行を取得する対象シートを格納する変数
    Dim ws As Worksheet

    ' UsedRangeで取得した使用範囲を格納する変数
    Dim usedDataRange As Range

    ' 取得した最終行番号を格納する変数
    Dim lastRow As Long

    ' 対象となるシートを指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' シート上で使用されている範囲を取得
    Set usedDataRange = ws.UsedRange

    ' UsedRangeの開始行と行数から最終行番号を算出
    ' UsedRangeが1行目から始まるとは限らないため、
    ' Row + Rows.Count - 1 で最終行を取得
    lastRow = usedDataRange.Row + usedDataRange.Rows.Count - 1

    ' 取得した最終行番号を確認
    MsgBox "UsedRangeの最終行は " & lastRow & " 行目です。"

End Sub

書式だけ設定されたセルにも注意

UsedRangeでは、値が入力されていなくても、過去に使用したセルや書式が設定されたセルまで使用範囲として扱われることがあります。

例えば実際のデータが7行目まででも、20行目のセルに背景色や罫線などの書式を設定すると、UsedRangeの最終行が20行目になる場合があります。

Excel VBAのUsedRangeで書式だけ設定されたセルが最終行に影響している画面

Findでシート全体の最終行を取得する方法

特定の列ではなく、シート全体から最後にデータが存在する行を取得したい場合は、Findを使用する方法があります。

Sub GetLastRow_Find()

    ' 最終行を取得する対象シートを格納する変数
    Dim ws As Worksheet

    ' Findで見つかった最後のセルを格納する変数
    Dim lastCell As Range

    ' 取得した最終行番号を格納する変数
    Dim lastRow As Long

    ' 対象となるシートを指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    ' シート全体から、値または数式が存在する最後のセルを検索
    ' What:="*" ですべての内容を検索対象にする
    ' LookIn:=xlFormulas で数式が入力されたセルも検索対象にする
    ' SearchOrder:=xlByRows で行を基準に検索する
    ' SearchDirection:=xlPrevious で後ろから前方向へ検索する
    Set lastCell = ws.Cells.Find( _
        What:="*", _
        After:=ws.Cells(1, 1), _
        LookIn:=xlFormulas, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False)

    ' シートにデータが1件も存在しない場合は
    ' Findの結果がNothingになるため確認
    If lastCell Is Nothing Then

        ' データが存在しない場合は0を設定
        lastRow = 0

    Else

        ' 見つかった最後のセルの行番号を取得
        lastRow = lastCell.Row

    End If

    ' 取得した最終行番号を確認
    MsgBox "Findで取得した最終行は " & lastRow & " 行目です。"

End Sub

Findでは検索条件を明示する

Findを使用する場合は、LookInLookAtSearchOrderなどの検索条件をできるだけ明示することをおすすめします。

ExcelのFindは検索ダイアログなどで使用した設定を引き継ぐ項目があるため、引数を省略すると意図しない検索結果になる場合があります。

4つの最終行取得方法を比較

今回ご紹介した4つの方法を比較すると、以下のようになります。

方法特徴注意点おすすめ用途
End(xlUp)指定した列の最後の値を簡単に取得できる他の列にさらに下のデータがあっても取得しない基準列が決まっている一覧データ
CurrentRegion連続した表全体を取得できる完全な空白行・空白列で範囲が分断される空白のない表形式データ
UsedRangeシート上の使用範囲を取得できる書式だけのセルなどが範囲に含まれる場合がある使用範囲全体を扱いたい場合
Findシート全体から最後のデータ位置を検索できる検索条件の明示とNothingの確認が必要データ位置が一定ではないシート

用途別のおすすめ

どの方法を使用すればよいか迷った場合は、次のように考えると分かりやすいかと思います。

  • A列など基準となる列が決まっている場合:End(xlUp)
  • 途中に完全な空白行・空白列がない表全体を扱う場合:CurrentRegion
  • 書式を含めたシートの使用範囲を確認したい場合:UsedRange
  • シート全体から実際のデータ位置を基準に最終行を探したい場合:Find

通常の一覧表であればEnd(xlUp)がシンプルで使いやすいですが、シート全体から最後のデータを探したい場合はFindも覚えておくと便利です。

最後に

いかがでしたでしょうか。

今回は、Excel VBAで最終行を取得する4つの方法についてご紹介しました。

最終行の取得は非常によく使用する基本処理ですが、どの方法でも同じ結果になるとは限りません。

単純にコードを覚えるだけではなく、「指定した列の最終行なのか」「連続した表の最終行なのか」「シート全体の最後のデータなのか」を考えて使い分けることが重要になるかと思います。

少しでもご参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA