最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
エクセルの表をマクロVBAで扱う時は、
データ部分の先頭から最終行までの、開始列から最終列まで処理する事が多いでしょう。
1行目に見出しがあれば、2行目から
1列目に見出しがあれば、2列目から

最終行取得の基本:手動ではCtrl + ↑、VBAではCells(1, 1).End(xlDown)
Ctrl + ↓
これで、A11に移動できます。
Cells(1, 1).End(xlDown)
になります。

Ctrl + ↑
とやれば、A11に移動できます。
Cells(Rows.Count, 1).End(xlUp)
になります。
は、シートの行数になります。
2007以降なら1048576です、2003なら65536です。
Directionは、
xlDown : 下へ
xlToLeft : 左へ
xlToRight : 右へ
xlUp : 上へ
ただし、
や
Cells(Rows.Count, 1).End(xlUp)
これは、最期のセルを表しています、つまり最期のセルのRangeオブジェクトになります。
や
Cells(Rows.Count, 1).End(xlUp).Row
これで、データの最後の行数を取得できます。
Cells(1, 1).End(xlDown).Rowは11と同じだと言う事です。
または
Cells(Rows.Count, 1).End(xlUp).Row
通常は、
Cells(Rows.Count, 1).End(xlUp).Row
これを使用します。
手動のCtrl+↑でも同じですが、可視セル(見えているセル)の最終行となってしまいます。
そのような方法ができない場合は、下記の別の方法を使用してください。
最終列の取得
や
シートの最終列(シートの一番右)のセルから、Ctrl + ←
または
Cells(1, Columns.Count).End(xlToLeft).Column
特殊な表の場合

これでは、9になってしまいます。
これなら、10になりますが、
・SpecialCells(xlCellTypeLastCell)
・UsedRange
・Findメソッド
CurrentRegion
または、
Range("B2").CurrentRegion.Row + Range("B2").CurrentRegion.Rows.Count - 1
これでは見ずらいので、Withでまとめると
With Range("B2").CurrentRegion
最終行 = .Item(.Count).Row
End With
または、
With Range("B2").CurrentRegion
最終行 = .Row + .Rows.Count - 1
End With
最初のコードは、アクティブセル領域の最後のセルの行位置を取得しています。
次のコードは、アクティブセル領域の開始行位置とアクティブセル領域の行数を足しています。
ただし、CurrentRegionなので、途中に空白行(何も入っていない行)がある場合は、
そこまでの行になってしまいます。
SpecialCells(xlCellTypeLastCell)
つまり、シートの使っているセルの最終位置を取得しています。
上の表なら、12となります。
(表範囲以外には何のデータもはいっていないとしてです。)
行高を規定高から変更しているだけでも、その行まで範囲に入ってしまいます。
つまり、シートの下の方で行高だけを変更していても、その行まで範囲に含まれてしまうという事です。
従って、注意しないと大きな範囲を処理するVBAとなってしまい、処理速度のとても遅いマクロになってしまいます。
UsedRange
または
ActiveSheet.UsedRange.row + ActiveSheet.UsedRange.Rows.count - 1
これでは見ずらいので、Withでまとめると
With ActiveSheet.UsedRange
最終行 = .Item(.Count).Row
End With
または、
With ActiveSheet.UsedRange
最終行 = .Row + .Rows.Count - 1
End With
使われたセル範囲の開始行位置と使われたセル範囲の行数を足しています。
UsedRangeは、シートの指定が必須となります。
ただし、
以下の注意点を良く確認してください、使うには少々注意が必要です。
行高を規定高から変更しているだけでも、その行まで範囲に入ってしまいます。
さらに、行を非表示行にしていても、その非表示行が範囲に含まれてしまいます。
つまり、
シートの下の方で行高だけを変更していても、罫線を引いていても、非表示にしていても、
これら、規定の状態から変更しているだけで、その行まで範囲に含まれてしまうという事です。
従って、注意しないと大きな範囲を処理するVBAとなってしまい、処理速度のとても遅いマクロになってしまいます。
※注意してください
「エクセル VBA」でググってトップの方に表示されるようなサイトでも以下のVBAコードがでている場合がありますです。
これでは、上記の表の場合、11となってしまいます。
つまり、UsedRangeなので、
未使用の行が先頭にある場合は、その行数が含まれなくなってしまうのです。
Findメソッド
最終行 = ActiveSheet.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
名前付き引数を使って書くと、
最終行 = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
あらゆる文字("*")を下から上へ(xlPrevious)へ探しています。
行方向なので(xlByRows)、列なら(xlByColumns)になります。
CellsはUsedRangeでも良いです。
ただし、複数の表(別々の連続セル範囲)があるシートでは、表を指定することはできません。
このような場合はCurrentRegionを使ってください。
また、Findメソッドは指定オプションがシート操作とリンクしている点については注意してください。
サイト内関連ページ
第6回.表の先頭から最終行まで繰り返す(ForとEnd(xlUp).Row)
Rangeの使い方:最終行まで選択を例に
最終行の判定、Rangeオブジェクトと配列、高速化の為に
同じテーマ「マクロVBA技術解説」の記事
RangeとCellsの深遠
Offset、Resizeを使いこなそう
値渡し(ByVal)、参照渡し(ByRef)について
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
ユーザー定義関数の作り方
セルの値について(Value,Value2,Text)
Excelのバージョンを判断して「名前を付けて保存」
空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)
空白セルを正しく判定する方法2
Rangeオブジェクト.Valueの省略について
シート保護でユーザー操作を制限する
新着記事NEW ・・・新着記事一覧を見る
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)
PIVOTBY関数(縦軸と横軸でグループ化して集計)|エクセル入門(2023-11-19)
GROUPBY関数(縦軸でグループ化して集計)|エクセル入門(2023-11-18)
PY関数(Pythonコードをセル内で実行)|エクセル入門(2023-11-17)
画像「セルに配置」のVBAについて(365の新機能)|VBA技術解説(2023-11-13)
スピルのゴーストの範囲を選択するVBA|ツイッター出題回答 (2023-10-31)
エクセル試験3:月間の所定労働時間|エクセル練習問題(2023-10-04)
エクセル試験2:所得税の計算|エクセル練習問題(2023-10-04)
エクセル試験1:曜日別の平均客単価|エクセル練習問題(2023-10-04)
列全体を指定する時のRangeとColumnsの違い|ツイッター出題回答 (2023-09-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.条件分岐(IF)|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。