Excel VBA | セル範囲取得(Endプロパティ)

VBA
スポンサーリンク

はじめに

「最後のデータが入っているセル」を自動で見つけられると、表の追記や集計がグッと楽になります。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

理由: 一番右から左へ戻るため、右側の空白に影響されない。

  • 完全に空の列/行の場合:
    • 落とし穴: 列がまるごと空だと、xlUpxlToLeftは“端のセル”を返すことがあります。実データがないかを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)の違いを比べる。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました