はじめに
「最後のデータが入っているセル」を自動で見つけられると、表の追記や集計がグッと楽になります。Excel VBAのEndプロパティは、初心者でも使いやすい“かゆいところに手が届く”機能です。動きのイメージと例題を交えて、手を動かしながら理解できるように説明します。
Endプロパティの考え方
- 役割: 基準のセルから上下左右のどれかに“スルッ”と移動して、次の空白の手前(=データが連続している最後)を返します。
- 向きの指定:
xlDown(下) /xlUp(上)xlToRight(右) /xlToLeft(左)
- 基本形:
Set 最後セル = Range("A1").End(xlDown)
VB例)A1から下にたどって、空白の直前=最後のデータセルを取得
基本の使い方とミニ例
- 下方向の最後を取る:
Sub 下方向の最後()
Dim last As Range
Set last = Range("A1").End(xlDown)
MsgBox "最後のセルは " & last.Address
End Sub
VB- 右方向の最後を取る:
Sub 右方向の最後()
Dim last As Range
Set last = Range("B2").End(xlToRight)
MsgBox "最後のセルは " & last.Address
End Sub
VB- 上方向・左方向も同様: 連続したデータの“端”を素早く見つけます。
例題1:表の最終行の次にデータを追加
「A列に名前が縦に並んでいる表」の最後の下に、新しい名前を1件追記します。
Sub 最終行に追加()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ActiveSheet
' A列の一番下から上へ向かって連続データの先頭(≒最下端)を取る
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 最終行の“次の行”に新しいデータを書き込む
ws.Cells(lastRow + 1, "A").Value = "新しい名前"
End Sub
VB- ポイント: 一番下のセル(行数の最大)から
xlUpで上がると、途中の空白に影響されず、A列で最後に入力されている行を安全に取れます。
例題2:最終列の右に見出しを追加
「1行目に見出しが横に並んでいる表」の右端のさらに右に、新しい見出しを追加します。
Sub 最終列の右に見出し追加()
Dim ws As Worksheet
Dim lastCol As Long
Set ws = ActiveSheet
' 1行目で右へたどって連続データの最後の列番号を取得
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' 右端のさらに右へ新しい見出し
ws.Cells(1, lastCol + 1).Value = "新しい項目"
End Sub
VB- ポイント: 横方向は「最右列から
xlToLeft」が安全。右側に空白があっても問題ありません。
注意点と安全な書き方
- 空白に弱い動き:
Range("A1").End(xlDown)は、A1から下に見て途中に空白があると、そこで止まります。途中に空白が混じる実データでは“中途半端”な場所で止まることがあります。
- 安全な最終行取得(定番):
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
VB理由: 一番下から上がるため、途中の空白に影響されにくい。
- 安全な最終列取得(定番):
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
VB理由: 一番右から左へ戻るため、右側の空白に影響されない。
- 完全に空の列/行の場合:
- 落とし穴: 列がまるごと空だと、
xlUpやxlToLeftは“端のセル”を返すことがあります。実データがないかをWorksheetFunction.CountAなどで併用して確認すると安心。
- 落とし穴: 列がまるごと空だと、
If Application.WorksheetFunction.CountA(Range("A:A")) = 0 Then
MsgBox "A列にデータがありません"
Exit Sub
End If
VBよくあるつまずきと対処
- 先頭セルが空だと意図通りに動かない:
- 対処: 先頭ではなく「端から戻る」書き方(Rows.Count/Columns.Countのテクニック)を使う。
- 表の途中に空白行がある:
- 対処: “連続”前提の
Endではなく、最終使用セルの考え方(UsedRangeやCountA、またはキー列を決めてxlUp)で処理する。
- 対処: “連続”前提の
- データ途中に数式の空文字””がある:
- 対処: 見た目が空でも値あり扱いになることがある。最終行の判断基準を「数式があるか」「値があるか」で分けてロジックを作る。
練習課題
- 課題1: A列の最終行を見つけて、B列の同じ行に「登録済み」と書く。
- 課題2: 1行目の最終列を見つけて、その右に今日の日付を見出しとして追加する。
- 課題3: データの途中に空白行がある表で、
Range("A1").End(xlDown)とCells(Rows.Count,"A").End(xlUp)の違いを比べる。
