【コピペOK】VBAで最終行・最終列を正確に取得する方法と応用例

ようこそ♪ささぽんのExcel教室へ。
マクロで作業を自動化したいときに、毎回データの最後の行数や列数が違う処理で悩んだことはありませんか?
マクロで「3行目まで処理」や「A列に追加」など決まった場所を指定してしまうと、行や列の位置が変わったときにエラーが起きたり想定外の処理がされたりしてしまいます。
そんな場面で役立つのが、「最終行・最終列を自動で取得する」方法です!
今回の記事では、その基本と応用の書き方を、実務で使える形で解説します!

この記事は以下のような方におすすめです!
・行や列の位置が変わるマクロを検討している方
・マクロでその都度処理範囲の判断を行わせたい方
・最終行・最終列の取得方法をマスターしたい方
このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。
読み終わるころにはきっと、
「Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。
一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!
目次
1. 最終行・最終列の取得方法(基本編)
Excelマクロで繰り返し処理やデータの追加を行うには、「どこまでデータが入っているか」を正確に把握することがとても重要です。
ここでは、最も基本的な最終行と最終列の取得方法を順番に解説していきます!
◼︎ 最終行を取得する(基本のコード)
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row ' A列の場合
このコードは、A列の中で一番下にあるデータの行番号を取得して”lastRow”に格納しています。
Rows.Count はExcelシートの最大行(1048576行)を表し、Cells(Rows.Count, 1) はA列の最下行を意味します。
そこから .End(xlUp) を使うことで、最下行から上に向かってデータを探し、最初に見つかったセルの位置を取得します。
これは、Excel上でA1048576セルにカーソルを置き、Ctrl + ↑ を押す操作と同じ動きです。
Ctrl + ↑ は、現在のセルから上方向にある「データが入力されているセル」まで一気にジャンプするショートカットキーです。

最初に見つかったセル=データが入っている最終行とみなすことで、何行目までデータが入っているかを判断しています!
◼︎ ︎最終列を取得する(基本のコード)
Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
このコードは、1行目の中で一番右にあるデータの列番号を取得して“lastcol”に格納しています。
Columns.Count はExcelシートの最大列(Excelでは16384列、XFD列)を示しており、Cells(1, Columns.Count) は1行目の最右端のセルを表します。
そこから .End(xlToLeft) を使うことで、右から左に向かってデータを探し、最初に見つかったセルの列番号を取得します。
これは、1行目のXFD列にカーソルを置いて Ctrl + ← を押すのと同じ動きです。
先ほどのCtrl + ↑の、左向きバージョンですね。
こちらも最初に見つかったセル=データが入っている最終列とみなすことで、何列目までデータが入っているかを判断しています!
◼︎最終行・最終列がズレる原因と注意点
最終行や最終列を取得するコードはとても便利ですが、指定する列や行を間違えてしまい、想定と違う行・列の処理をしてしまうことがあります。
たとえば「最終行」を取得したつもりでも、A列の最終行を基準にしていて実際にはB列の方が下までデータが入っていた場合、一部のデータが取りこぼされてしまいます。
同じように、途中に空白列があると、最終列を取得したときにその空白セルの手前で処理が終わってしまうこともあります。
このようなトラブルを防ぐためには、どの列・行を基準にするかを意識して選ぶことがとても重要です。
特定の行・列を基準にするとずれてしまう可能性がある場合には、次の章の応用テクニックを試してみてください!
2.複数列・複数行に対応する(応用編)
最終行や最終列を1つの列・行だけで判断すると、データの一部を見落としてしまうことがあります。
ここでは、複数の列や行を比較して、正確に最終位置を特定する方法を紹介します。
◼︎複数の列から最も下の行を検索する
最終行を取得する方法として便利なのが UsedRange を使う方法です。
UsedRange は、実際に「使われている」とExcelが認識している範囲を自動で判定してくれます。
例えば:
Dim lastRow As Long
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
このコードでは、UsedRangeで得られた範囲の中で一番下の行を調べています。
手軽に実装でき、ある程度のデータ変動にも柔軟に対応できるのが特徴です。
ただし、一度入力して削除したセルや、空白を返す数式があるセルは「未使用」と判定されることがあるため、完全に正確とは限りません。
シートの状態によっては、予想よりも上の行が最終行と判断される場合もあるので注意が必要です。
◼︎UsedRangeで最終列を取得する
最終行と同様に、シート上で使われている最も右の列(最終列)も、UsedRangeを使って取得することができます。
例えば:
Dim lastCol As Long
lastCol = ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column
このコードは、UsedRangeで認識された範囲の中で「最後の列」に該当する列番号を返します。
行数と同様、UsedRangeのサイズに応じて動くため、データ量が変動しても柔軟に対応できるのがメリットです。
ただし、こちらも同じく見た目は空白でも、過去にデータを入力していたセルが残っていたり、削除の履歴が反映されていない場合、UsedRangeが必要以上に広くなる(=最終列が右にずれる)こともあります。
逆に、数式や空白セルを含む場合には「使われていない」と判断されて、思ったより左側の列が最終列とされてしまうこともあるため、注意して使いましょう。
◼︎Forループで全列・行を確認して正確に判定
UsedRangeを使えば処理は速いですが、シートの状態によっては最終行・最終列が正しく判定できないこともあります。
そうしたときに使えるのが、Forループで1列ずつ(または1行ずつ)確認し、最も大きな行番号・列番号を取得する方法です。
以下は、すべての列を対象に最終行を調べ、最大値を取得するコードです。
Dim lastRow As Long
Dim tempRow As Long
Dim col As Long
For col = 1 To Columns.Count
If Application.WorksheetFunction.CountA(Columns(col)) > 0 Then
tempRow = Cells(Rows.Count, col).End(xlUp).Row
If tempRow > lastRow Then
lastRow = tempRow
End If
End If
Next col
この方法なら、どの列にどれだけデータが入っていても、正確に最終行を特定できます。
ただし処理にはやや時間がかかるため、「処理速度よりも精度を優先したい場面」で使うようにしましょう!
3.最終行・最終列を使った実用マクロ例
ここからは、実際の業務で使える具体的なコードをご紹介します。
最終行や最終列をうまく使えば、繰り返しの手作業をスマートに自動化できるようになるのでぜひ取り入れてみてください。
◼︎最終行の下にデータを追加する
最後のデータの下に新しい行を追加していく処理は、日報や売上記録、ログ管理など、日常業務でよく使われるパターンです。
記入すべき行が変わる場合でも、最終行を自動で判定すれば、常に正しい位置にデータを追加できます。
以下のコードはA列の最終行を取得し、そのすぐ下のセルに「新しいデータ」を書き込むシンプルなマクロです。
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Cells(lastRow + 1, 1).Value = "新しいデータ"
このように、lastRow + 1 を使うことで、常に最新の行のすぐ下にデータを追加できるようになります。
固定の行番号に頼らず、データ量が変わっても柔軟に対応できるのがこの方法の魅力です!
◼︎最終行×最終列の範囲を自動選択する
Excelで使われている範囲全体に対して、書式を設定したり罫線を引いたりしたいとき、手動で設定するのは手間がかかりますよね。
そんな場面で役立つのが、最終行と最終列を組み合わせて、範囲を自動選択するマクロです。
以下のコードは、A1セルから始まり、使われている最も右下のセルまでを選択します。
Dim lastRow As Long
Dim lastCol As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Range(Cells(1, 1), Cells(lastRow, lastCol)).Select
このマクロを使えば、表のサイズが変わっても自動的に正しい範囲を選択できるため、「塗りつぶし」「罫線」「フォント調整」などを一括で行う処理と組み合わせると便利です。
◼︎可変の範囲を対象にループ処理を行う
データの量が毎回変わる表に対して、1行ずつ処理を繰り返したい場面も多いですよね。
たとえば、入力された行ごとにチェックや計算を行うような処理では、「どこまで繰り返すか」を最終行で判断するのが基本です。
以下は、A列にある数値を読み取り、80点以上ならB列に「合格」と記録するマクロです。
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If IsNumeric(Cells(i, 1).Value) Then
If Cells(i, 1).Value >= 80 Then
Cells(i, 2).Value = "合格"
Else
Cells(i, 2).Value = "不合格"
End If
End If
Next i
このように、最終行を判定して繰り返す処理は、データの量が変わっても柔軟に対応できるのが強みです。
実務では名簿チェック、売上評価、タスクのステータス判定など、さまざまな場面に応用できます!
今回紹介したマクロは、どれも最終行・最終列をうまく使うことで、柔軟かつ安全に処理できるようになります。
実際の業務に合わせてアレンジして、繰り返しの作業を効率化しましょう!
4.実務での使用場面紹介
最終行・最終列の取得は「コードの書き方」としてはシンプルですが、「実際にどこで使えばいいの?」と疑問に思う方もいるかもしれません。
この章では、日々の業務でよくある処理の中から、最終行・最終列の知識が役立つ具体的な場面を紹介していきます!
◼︎新しいデータを常に下に追加するレポート・ログ等の処理
Excelを使った業務で特によくあるのが、「過去のデータの下に新しいデータを追加していく」形式のレポートです。
たとえば売上履歴、作業日報、問い合わせ記録など、新しい情報を一番下に順番に追加する処理はさまざまな職場で活用されています。
私自身も、ある業務で「お客様の申し込み情報を一覧から抜粋して、必要な項目だけを別シートに転記する」というマクロを作成したことがあります。
そのとき、転記先の最終行を毎回自動で判定して、+1 の行に情報を追加することで、安定して繰り返し使えるマクロにすることができました。
このように、データの増減があっても常に正しい場所に処理が入るようにするためには最終行の判定が不可欠です。
◼︎データ整形や範囲指定を自動で行う処理
Excelで定型フォーマットを作るときなど、念のため未入力の欄まで罫線を引いておいたり、引いておいた罫線が足りなくなっていたりして見栄えがイマイチ…という場面はありませんか?
入力されている範囲だけに書式や罫線を付けたいとき、最終行・最終列の情報があると処理範囲を自動で特定できて便利です。
私が実際に作ったマクロでも、データの加工処理のあと、整形して見栄えを整える目的で罫線を引くという流れがありました。
最終行と最終列を取得して罫線を引くようにしていたので、どんなに行数・列数が変わっても綺麗な表が完成します。
固定範囲に対して罫線を引くと「データが短いとスカスカ/長いと足りない」などのズレが起きがちですが、最終セルまでを自動で判定するようにすれば、毎回ぴったり整った状態で処理が終了します。
上司向けの報告に使う場合などに、見た目が整っている資料が1発で完成するので便利です!
◼︎条件チェックや評価を行うループ処理
入力されたデータに対して、条件を判定して評価を加える処理は、Excel業務の中でも定番のパターンです。
たとえば、点数が一定以上なら「合格」、未入力なら「未記入」などのフラグを自動で付ける処理がよく使われます。
こうしたループ処理では、「どこまでデータが入っているか?」を正しく判定して処理しないと、余分な行までループを繰り返してしまい、処理時間の延伸につながります。
そんなときは「最終行まで繰り返す」という書き方をして無駄のないループ処理ができるように工夫しましょう。
ループ処理と最終行の組み合わせは、VBAマクロで実務を支える定番コンビとも言えますね。
最終行・最終列の取得は、レポートの自動追加やデータ整形、条件判定など、さまざまな実務シーンで活躍します。
用途に応じて使い方を工夫して、マクロの安定性と柔軟性を高めましょう!
5.まとめ:最終行・最終列を使いこなして便利なマクロを作ろう
ここまで、最終行・最終列を取得する基本の考え方から、応用テクニック、実務での活用例までを順番に見てきました。
最後に改めて、最終行・最終列についておさらいしていきましょう!
◼︎最終行・最終列の基本をおさらい!
最終行・最終列の取得は、データの量や形が毎回変わる処理で欠かせません。
処理のために本編で出てきたコードを簡単にまとめました:
方法 | 特徴 | よく使う場面 |
.End(xlUp) | 最下行から上に向かって探す | 1列だけを対象に最終行を知りたいとき |
.End(xlToLeft) | 一番右から左に向かって探す | 1行だけを対象に最終列を知りたいとき |
UsedRange | Excelが認識する使用範囲を取得 | 全体的に範囲を把握したいとき |
For+CountA | 全列・行を正確にチェック | 精度重視、複数列/複数行が対象の場合 |
どの処理でも、「どこまでを対象にすべきか」がズレると、思わぬバグや見落としにつながります。
用途に合わせて判定方法を使い分けましょう。
◼︎実務で使える最終行・最終列判定を使った処理
最終行・最終列の判定が活きるのは、「データが毎回変わる」Excel実務ならではの悩みを解決したいときです。
どんな場面でどう使えるのか、代表的なパターンを振り返ってみましょう。
- 既存データの下に新しいデータを書き込む処理
→最終行+1 の位置に新しい情報を追加できるので、申込ログや売上履歴などで大活躍! - 表の範囲に罫線・色などを設定する処理
→最終行×最終列を使えば、表の大きさに応じて罫線や書式の範囲を自動で調整可能! - ループ処理でデータが入っている行だけを対象にする処理
→ループで最終行までを対象にすれば、空白行まで無駄に処理することなく、必要な部分だけを正確にチェックできる!
こうした使い方を取り入れることで、「データの変化に強いマクロ」=実務で使えるマクロができるようになります。
最終行・最終列の取得は、マクロを安定して動かすための基本であり、実務でも非常によく使われる大切な考え方です。
今回紹介した方法やマクロ例をベースに、自分の業務に合わせて少しずつ応用していけば、着実にスキルアップできます。
「固定の行番号に頼らない」「どんなデータ量にも柔軟に対応する」そんなマクロを目指して、ぜひ一歩ずつ習得していきましょう!
\ Excelマクロ制作も承っています /
各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!