〖ExcelVBA〗最終列・最終セルを正しく取得する基本コードまとめ|列ズレ・空白に強い方法

ExcelVBA

ExcelVBAでマクロを作っていると、最終列最終セルを取得したい場面がよくあります。

  • 表の横幅を自動で取得したい
  • データ範囲を自動で指定したい
  • 列数が増減する表に対応したい

最終行は正しく取れているのに、
最終列がズレて処理がおかしくなるのは初心者がとてもつまずきやすいポイントです。

この記事では、実務で安心して使える「最終列・最終セルの取得方法」を基本から解説します。


スポンサーリンク
スポンサーリンク

結論:最終列・最終セルも「使い分け」が重要

最終列・最終セルの取得方法も、状況によって使い分けます。

  • ① 定番:見出し行を基準に最終列を取得
  • ② 便利:UsedRange を使う方法
  • ③ 最強:Find を使って本当に最後のセルを探す

①【定番】1行目(見出し行)を基準に最終列を取得する

「1行目に必ず見出しが入っている」表なら、この方法が一番シンプルで速いです。

Option Explicit

Sub GetLastColumn_Basic()

    Dim ws As Worksheet
    Dim lastCol As Long

    Set ws = ActiveSheet

    ' 1行目を基準に最終列を取得
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    MsgBox "最終列は " & lastCol & " 列目です。", vbInformation

End Sub

ポイント

  • 右端の列から左に向かって、データがある列を探す
  • 見出し行がしっかり入っている表に向いている

②【便利】UsedRange を使って最終列を取得する

シート全体の「使っている範囲」を基準にしたい場合は、UsedRange を使います。

Option Explicit

Sub GetLastColumn_UsedRange()

    Dim ws As Worksheet
    Dim lastCol As Long

    Set ws = ActiveSheet

    lastCol = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1

    MsgBox "UsedRange基準の最終列は " & lastCol & " 列目です。", vbInformation

End Sub

注意点

UsedRange は、過去に使ったセルが残っていると、
実際より右側まで「使っている」と判断されることがあります。

「最終列がやたら右になる」場合は、この影響を疑ってください。


③【最強】Find を使って最終セル・最終列を取得する

空白が混ざっていたり、列ごとにデータの入り方が違う表では、
Find を使う方法が最もズレにくく安全です。

シート内で「最後に使われているセル」を取得

Option Explicit

Sub GetLastCell_Find()

    Dim ws As Worksheet
    Dim lastCell As Range

    Set ws = ActiveSheet

    Set lastCell = ws.Cells.Find( _
        What:="*", _
        LookIn:=xlFormulas, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious)

    If lastCell Is Nothing Then
        MsgBox "シートにデータがありません。", vbExclamation
        Exit Sub
    End If

    MsgBox "最終セルは " & lastCell.Address(False, False) & " です。", vbInformation

End Sub

最終行・最終列を個別に取りたい場合

Dim lastRow As Long
Dim lastCol As Long

lastRow = lastCell.Row
lastCol = lastCell.Column

この方法は、基準行・基準列に依存しないため、実務ではとても強力です。


おまけ:最終列までの範囲を自動取得する

最終行・最終列が分かれば、表全体の範囲を簡単に指定できます。

Dim rng As Range
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))

コピー・並び替え・フィルターなど、ほぼすべての処理で使える基本形です。


初心者がやりがちなミス

  • 列途中に空白があるのに End(xlToLeft) を使ってズレる
  • UsedRange を信じすぎて余計な列まで処理する
  • 最終行と最終列で別の基準を使って範囲が歪む

「なんかズレるな?」と思ったら、Find を使う方法に切り替えるのがおすすめです。


まとめ:最終列・最終セル取得の使い分け

  • 見出し行が安定している → End(xlToLeft)
  • シート全体の使用範囲 → UsedRange
  • 空白が混ざる・構造が不安定 → Find(最強)

最終列・最終セルの取得は、
VBAで「ズレない」「止まらない」処理を書くための重要な基本コードです。

ぜひ、あなたのVBAテンプレートに組み込んで活用してください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました