End オブジェクトRangeプロパティ
スポンサーリンク 目次- 1. 概要
- 2. 基本構文
- 3. Direction引数の定数
- 4. Endプロパティの動作イメージ
- 5. 使用例
- 例1:ある列の最後のデータセルを取得する
- 例2:空白セルが途中にある場合の動作確認
- 例3:行の最終セルを取得する
- 6. 実務でのよくある使い方
- 1)最終行・最終列の取得
- 2)データ範囲を自動取得
- 7. 注意点と落とし穴
- 1)起点セルの選択
- 2)空白セルの途中の影響
- 3)ワークシートの最大行数・最大列数に注意
- 8. 他のプロパティとの組み合わせ例
- UsedRangeとEndの組み合わせ
- 9. EndプロパティとVBAキーボードショートカット対応表
- 10. 応用例:空白セルが途中にあっても最後のセルを取得する方法
1. 概要
VBAのRangeオブジェクトのEndプロパティは、Excelのキーボード操作で言うところの「Ctrl + 矢印キー」に相当する動作をプログラムで実行するためのプロパティです。あるセルから連続するセルの範囲の端まで移動したいときに使います。
たとえば、ある列の最初のセルからデータが続いている最後のセルまで一気に移動したい場合や、逆に空白セルの方向に移動したい場合など、表のデータの最終行や最終列を調べるのに頻繁に使われます。
2. 基本構文
RangeObject.End(Direction)- RangeObject:開始セルとなるRangeオブジェクト(通常は1セル)
- Direction:移動方向を指定する定数。必須。
戻り値はRangeオブジェクトで、開始セルから指定した方向に向かって連続したセルの範囲の「端」のセルを表します。
3. Direction引数の定数
Direction引数には、ExcelのVBAで以下の定数を使います。
定数名値説明xlUp-4162上方向(↑)に移動xlDown-4121下方向(↓)に移動xlToLeft-4159左方向(←)に移動xlToRight-4161右方向(→)に移動4. Endプロパティの動作イメージ
たとえばセルA1を起点にRange("A1").End(xlDown)とすると、A1から下方向に連続してデータが入力されているセルの最後のセルを返します。
もし途中に空白セルがあれば、最初に空白セルの直前のセルまで到達します。
Excelのシート上でA1を選択し、Ctrl + ↓を押した時と同じ動作です。
5. 使用例
例1:ある列の最後のデータセルを取得する Dim lastCell As RangeSet lastCell = Range("A1").End(xlDown)MsgBox "最終データセルは " & lastCell.Addressこの例では、A1セルから下方向に連続したデータの最終セルを取得しています。
例2:空白セルが途中にある場合の動作確認例えば、A1セルからA5までデータがあり、A3だけ空白の場合、
Set lastCell = Range("A1").End(xlDown)はA2セルを返します。これはA1から下に連続しているセルがA2までだからです。
例3:行の最終セルを取得する Dim lastCellInRow As RangeSet lastCellInRow = Range("B5").End(xlToRight)MsgBox "行の最終セルは " & lastCellInRow.AddressB5から右方向に連続したセルの最後を取得します。
6. 実務でのよくある使い方
1)最終行・最終列の取得データ範囲の最終行や最終列を取得する際、Endプロパティを使うのが一般的です。
例:A列の最終行を取得
Dim lastRow As LonglastRow = Cells(Rows.Count, 1).End(xlUp).Row解説:
- Cells(Rows.Count, 1)はA列の最終行セル(Excelの最大行数例: 1048576)を指します。
- そこから上方向に向かってデータがあるセルまで移動し、その行番号を取得。
これは空白セルが途中にあっても確実に最終行を特定するための方法です。
同様に、最終列の取得は次のようになります。
Dim lastCol As LonglastCol = Cells(1, Columns.Count).End(xlToLeft).Column 2)データ範囲を自動取得ワークシートのある列のデータが何行あるか自動判定し、その範囲に処理をかけることができます。
Dim lastRow As LonglastRow = Cells(Rows.Count, "A").End(xlUp).RowRange("A1:A" & lastRow).Select7. 注意点と落とし穴
1)起点セルの選択Endは必ず1セルのRangeオブジェクトを起点に使います。複数セルの範囲に使うとエラーになります。
2)空白セルの途中の影響Endは連続した非空セルの範囲の端まで移動します。途中に空白があればそこで止まります。そのため「最後のデータセルを取得したい」ときは、起点を最大行・最大列のセルにして、xlUpやxlToLeft方向で取得する方法が一般的です。
3)ワークシートの最大行数・最大列数に注意Excelのバージョンによって最大行数(例:Excel2007以降は1048576行)、最大列数(16384列=XFD列)が違います。起点をCells(Rows.Count, 1)やCells(1, Columns.Count)とするのはそのためです。
8. 他のプロパティとの組み合わせ例
UsedRangeとEndの組み合わせ Dim lastCell As RangeSet lastCell = ActiveSheet.UsedRange.Cells(1).End(xlDown)MsgBox lastCell.Addressただし、UsedRangeは消去されたセルの履歴などの影響を受けるので万能ではありません。
9. EndプロパティとVBAキーボードショートカット対応表
VBA EndプロパティExcelキーボード操作説明Range("A1").End(xlDown)Ctrl + ↓下方向の連続するデータの最後のセルに移動Range("A1").End(xlUp)Ctrl + ↑上方向の連続データの最初のセルに移動Range("A1").End(xlToRight)Ctrl + →右方向の連続データの最後のセルに移動Range("A1").End(xlToLeft)Ctrl + ←左方向の連続データの最初のセルに移動10. 応用例:空白セルが途中にあっても最後のセルを取得する方法
空白セルが途中にあるとEnd(xlDown)は途中で止まってしまうので、最終行取得には下記の方法が多用されます。
Dim lastRow As LonglastRow = Cells(Rows.Count, "A").End(xlUp).Rowこれは列Aの最終行を逆方向に調べる方法で、空白セルの影響を受けません。