目標
ExcelVBAのEndプロパティを理解して操作できる
ExcelVBAではプロパティを知るとかなり多くの処理を自動で行わせることができます。加えて、VBAのプログラミング学習では変数や制御構造を学ぶ前にいろいろな設定を経験すると制御構造や様々なデータ構造の学習に入ったときに、オブジェクトやプロパティについて悩まなくてもよくなるので学習効率が良くなります。
ExcelVBAでよく使う「9つのプロパティ」
プロパティ(アルファベット順) |
ActiveSheet |
ActiveCell |
Cells |
End ※今回の記事で扱うプロパティです。 |
Offset |
Range |
Sheets |
Value |
Worksheets |
Endプロパティの概要と利用方法
Endプロパティとは
Endプロパティはエクセルのワークシート内でデータが入力されている表の末端(終端)のセルを取得します。組み込み定数によって右端、左端、上の端、下の端を取得することができます。
オブジェクト.End(方向を示す組み込み定数)
組み込み定数 | 記述例 | 移動の方向 | キーボードでの操作 |
xlUp | Range(“C6”).End(xlUp).Select | 上 | Ctrl + ↑ |
xlDown | Range(“C6”).End(xlDown).Select | 下 | Ctrl + ↓ |
xlToRight | Range(“C6”).End(xlToRight).Select | 右 | Ctrl + → |
xlToLeft | Range(“C6”).End(xlToLeft).Select | 左 | Ctrl + ← |
VBAの記述例として上下左右方向への動きをいずれも「セルC6」をアクティブセルとしてから移動させてみます。前回の「Ctrl+矢印キー」の移動と同様の動きを確認できます。
Sub practiceEnd()
Worksheets("Sheet4").Activate
Range("C6").Select
MsgBox "C6を選択しました"
Range("C6").End(xlUp).Select
MsgBox "上方向へ移動しました"
Range("C6").Select
MsgBox "C6を選択しました"
Range("C6").End(xlDown).Select
MsgBox "下方向へ移動しました"
Range("C6").Select
MsgBox "C6を選択しました"
Range("C6").End(xlToRight).Select
MsgBox "右方向へ移動しました"
Range("C6").Select
MsgBox "C6を選択しました"
Range("C6").End(xlToLeft).Select
MsgBox "左方向へ移動しました"
End Sub
操作後の動きを画面キャプチャで一枚ずつ見ていくと下のようになります。
記述例と動きについては以上です。
Endプロパティ使用時の注意点
Endプロパティの後は.Selectを(Selectメソッド)を付け忘れないようにします。※Selectメソッド以外にもオブジェクトが続くときがあります。
記述例:Range(“B3”).End(xlDown).Offset(1, 0).Select
意 味:セルB3から表の最下段へ移動してひとつ下の空白セルを選択する
組み込み定数 | 記述例 | 移動の方向 | キーボードでの操作 |
xlUp | Range(“C6”).End(xlUp).Select | 上 | Ctrl + ↑ |
xlDown | Range(“C6”).End(xlDown).Select | 下 | Ctrl + ↓ |
xlToRight | Range(“C6”).End(xlToRight).Select | 右 | Ctrl + → |
xlToLeft | Range(“C6”).End(xlToLeft).Select | 左 | Ctrl + ← |
Endプロパティがよく使われるプログラム
データテーブに新しいレコードを追加するプログラムではEndプロパティが利用されます。
Aパターン(オブジェクト.End(xlDown).Select)
① 表の下端のセルを取得(へ移動)(Endプロパティの利用)
② 更にひとつ下の空白セルへ移動
③ レコード入力
Bパターン(オブジェクト.End(xlUp).Select)
① ワークシートのシートの最下部のセルを取得
② 表の下端のセルを取得(Endプロパティの利用)
③ ひとつ下の空白セルへ移動
④ レコード入力
この記事ではBパターンでプログラムを作成します。
サンプルプロシージャ
Sub AddRecord()
Dim LN As Integer
Worksheets("Sheet4").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Select
LN = ActiveCell.Row
Cells(LN, 2).Value = "29"
Cells(LN, 3).Value = "電気代"
Cells(LN, 4).NumberFormatLocal = "\##,###"
Cells(LN, 4).Value = ""
Cells(LN, 5).NumberFormatLocal = "\##,###"
Cells(LN, 5).Value = "6237"
Cells(LN, 6).FormulaR1C1 = "=R[-1]C + RC[-2] - RC[-1]"
End Sub
プログラムの解釈
RowsやRow、Countについて補足的に説明をくわえると以下のようになります。
AddRecordという名前でプロシージャの宣言
Sub AddRecord()
LNをInteger型で宣言「LN = ActiveCell.Row」で利用する
Dim LN As Integer
WorkSheetのSheet4で
Cells(Rows.Count,2)を指定して
※ Cells(Rows.Count,2)のRows.Countはシートの一列に存在するセルの総数を数えています。現在のExcelでは1048576個なので、読み替えるとCells(1048576, 2) →「セルB1048576」を指定しています。
End(xlUp)で上方向の値のあるセルまで移動
→今回の実行時にはB11となります。
Offset(1,0).Selectでひとつだけセルを下へ移動
→今回の実行時にはB12となります。
以上を1行で書くと下のような記述になります。
Worksheets(“Sheet4”).Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Select
アクティブセルのRow(上から何番目のセルか)を数えてLNへ入力
→今回の場合は「LN=12」となります。
LN = ActiveCell.Row
Cells(LN, 2).Value = “29”
Cells(LN, 3).Value = “電気代”
Cells(LN, 4).NumberFormatLocal = “\##,###”
Cells(LN, 4).Value = “”
Cells(LN, 5).NumberFormatLocal = “\##,###”
Cells(LN, 5).Value = “6237”
Cells(LN, 6).FormulaR1C1 = “=R[-1]C + RC[-2] – RC[-1]”
End Sub
実行結果
無事に表の最下段に新しいデータが入力されました。
今回は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。