「せっかくマクロを作ったのに、データの件数が変わったらうまく動かなくなった……もう嫌だ」
そんなふうに、画面の前でため息をついていませんか?
今日はVBAの「最終行の取得」についてお話しします。
どんな悩みを解決するの?
- 日によってデータの行数(件数)が変わるため、マクロで範囲指定ができない。
- 途中に空白行があると、そこで処理が止まってしまう。
- 「A1:A100」のように決め打ちで書いてしまい、101件目のデータが無視される事故が怖い。
これらの悩みは、たった1行のコードで解決します。
このコードをコピペしてください
一番下の行が何行目なのかを知るための、書き方がこちらです。
Dim lastRow As Long
' A列の最終行を取得する
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
これだけです。
なぜ「上から」ではなく「下から」なのか?
Excelのワークシートは、実はものすごく縦に長いです。
現在のExcel(.xlsx)では、最大約100万行もあります。
初心者の多くは、上(1行目)から下に向かってデータを探そうとします(End(xlDown)を使いたがります)。
でも、もしデータの途中に「入力漏れの空白セル」があったらどうなるでしょう?
そこで「あ、ここで終わりね」と勘違いして止まってしまうのです。
一方、今回紹介したCells(Rows.Count, 1).End(xlUp)は、以下のような動きをします。
- エレベーターで一番底(1,048,576行目)まで一気に降りる。
- そこから「上」を見上げる。
- 一番最初に見つかった「データが入っている階(セル)」で止まる。
これなら、途中に空白があっても関係ありません。確実に「一番下のデータ」を見つけることができます。
実践!明日から使えるコピペ用コード
では、実際の業務でよくある「売上データを、マスタシートの最終行の下に追加する」という作業を自動化してみましょう。
Sub CopyDataToMaster()
Dim wsSource As Worksheet
Dim wsMaster As Worksheet
Dim lastRowSource As Long
Dim lastRowMaster As Long
' シートの設定(名前は自分の環境に合わせて変えてください)
Set wsSource = ThisWorkbook.Sheets("売上入力")
Set wsMaster = ThisWorkbook.Sheets("売上マスタ")
' 1. コピー元(売上入力)の最終行を探す
lastRowSource = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
' データが1件もない場合は処理を終わる
If lastRowSource < 2 Then Exit Sub
' 2. コピー先(マスタ)の最終行を探す
lastRowMaster = wsMaster.Cells(wsMaster.Rows.Count, 1).End(xlUp).Row
' 3. データをコピーして、マスタの「最終行の1つ下」に貼り付け
wsSource.Range("A2:C" & lastRowSource).Copy wsMaster.Cells(lastRowMaster + 1, 1)
MsgBox "転記が完了しました!"
End Sub
今回は分かりやすくするためRangeを使いましたが、Cellsで書いたほうがスッキリします。
ポイントは「変数」を使うこと
コードの中にlastRowSourceという言葉(変数)が出てきました。
ここに「今日の最終行」という数字が自動で入ります。
- 今日は100行目までデータがある → Range(“A2:C100“) として動く
- 明日は5行しかない → Range(“A2:C5“) として動く
このように、Excelが勝手に空気を読んで範囲を変えてくれるようになります。使いこなせるととても便利なので、ぜひ習得してください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント