
エクセルに作られた表全体にマクロで罫線を引きたいんだけど、
そのためには最終行や最終列を知る必要がある…。
同じくマクロで表の最終行や最終列を取得できないの?

なるほど…。
では今回は、「エクセルに作られた表の最終行・最終列をマクロで取得する方法」を
VBAマクロ歴3年の私が、できるだけわかりやすく解説いたします。
表の最終行・最終列を取得する方法3選(エクセルVBAマクロ)

エクセルに作られた表の最終行・最終列を取得する方法を3つ紹介いたします。
「マクロの基礎知識」「変数の宣言」「メッセージボックスの表示」に関する予備知識が必要となります。
それぞれ下記記事にて詳しく解説しておりますので、ご参考ください。
End(xlUp・xlToLeft)
最も一般的に使われる方法です。
Sub 最終行を取得1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "最終行: " & lastRow
End Sub
コードの3行目で表の最終行を取得しています(変数「lastRow」に最終行を代入)
取得した最終行を、今回は4行目でメッセージボックスに出力しています。

最終列を取得したい場合は、下記のとおりコードを変更してください。
Sub 最終列を取得1()
Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox "最終列: " & lastCol
End Sub
取得されるのは最終行の行番号です。
最終行のセルの値を取得したい場合は、下記コードのように4行目を追加してください。
Sub A列最終行の値を取得1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastValue = Cells(lastRow, 1).Value
MsgBox "A列最終行の値: " & lastValue
End Sub

B列最終行の値を取得したい場合は、コード3行目と4行目の「1」を「2」に変えてください。
Sub B列最終行の値を取得1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
lastValue = Cells(lastRow, 2).Value
MsgBox "B列最終行の値: " & lastValue
End Sub

UsedRange
2つ目に紹介するのは「UsedRange」です。
Sub 最終行を取得2()
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
MsgBox "最終行: " & lastRow
End Sub
3行目に暗号のようなものが羅列されておりますが、覚えるのは大変です。
本記事をブックマークして、いつでも確認できるようにすることをおすすめします。
最終列を取得したい場合は、下記のとおりコードを変更してください。
Sub 最終列を取得2()
Dim lastCol As Long
lastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
MsgBox "最終列: " & lastCol
End Sub
こちらも最終行のセルの値を取得したい場合は、下記コードのように4行目を追加してください。
※1つ目のEnd(xlUp・xlToLeft)と同じ
Sub A列最終行の値を取得2()
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
lastValue = Cells(lastRow, 1).Value
MsgBox "A列最終行の値: " & lastValue
End Sub
SpecialCells(xlCellTypeLastCell)
最後に紹介するのは、「SpecialCells(xlCellTypeLastCell)」を使う方法です。
Sub 最終行を取得3()
Dim lastRow As Long
lastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
MsgBox "最終行: " & lastRow
End Sub
同じく3行目で最終行を取得しています。
最終列を取得したい場合は、3行目の「Row」を「Column」に変えてください。
Sub 最終列を取得3()
Dim lastCol As Long
lastCol = Cells.SpecialCells(xlCellTypeLastCell).Column
MsgBox "最終列: " & lastCol
End Sub
こちらも最終行のセルの値を取得したい場合は、下記コードのように4行目を追加してください。
※1つ目のEnd(xlUp・xlToLeft)と同じ
Sub A列最終行の値を取得3()
Dim lastRow As Long
lastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
lastValue = Cells(lastRow, 1).Value
MsgBox "A列最終行の値: " & lastValue
End Sub
以上紹介した3つの方法について、どう違うのか、どれを使うべきなのか迷っている場合は、次項をご参考ください。
どの方法を使うべき?(選び方の解説)
前項で紹介した3つの方法ですが、どの方法を使えばいいのでしょうか?
それは、「目的に応じて使い分ける」というのがベストです。
それぞれの方法のメリットとデメリットを下記にまとめてみました。
【End(xlUp・xlToLeft)】
メリット:実際のデータの最終行・最終列を正確に取得できる
デメリット:1列目・1行目にデータがないと取得できない
【UsedRange】
メリット:空白セルがあっても取得可能
デメリット:セルの値を削除した後も最終行・列の範囲が更新されない可能性あり
【SpecialCells(xlCellTypeLastCell)】
メリット:シート全体のデータ範囲を取得できる
デメリット:セルの値を削除した後も最終行・列の範囲が更新されない可能性あり
処理が遅くなる場合がある
表の中に空白セルが存在する可能性がある場合は「UsedRange」、
それ以外の場合は「End(xlUp・xlToLeft)」を使うのが最適です。
SpecialCells(xlCellTypeLastCell)は、処理が遅くなる場合があるため、あまり使われません。
また下の2つは、セルの値が削除されても最終行・列が更新されない場合があるため、やや不正確になります。
例えば最終行である5行目のセルデータを削除しても、5行目を最終行と認識してしまう可能性がありますので注意しましょう。
最後に
VBAマクロでエクセルの表の最終行・最終列を取得する方法を解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!