- VBAを使ってシートにある表の
最下段(最終行)と
最右列(最終列)の位置を取得できます。 - テーブルオブジェクトの右端もとる方法がわかります。
- この手法の注意点も
こんにちは、hokkyokunです。
表のはしっこ
最下段(最終行)や最右列(最終列)を取得する方法をご紹介します。
何かの処理を書くときは必ずと言っていいほど書いています。
さくっと覚えちゃいましょう。
最下段の取り方
取り方1
コード
コードは以下です
ws.Cells(Rows.Count, 1).End(xlUp).Row
ざっくり説明すると以下のようになります。
例えば以下のような表の最下段をとりたいと思います。
①ws.Cells(Rows.Count, 1)はどこ?
下記の図の赤枠で囲った部分です。
A1048576 を指します。
②.End(xlUp)はどこ?
A1048576から上に登って何かが入力されている最初のセルを指します。
図で言うと最下段の「メロン」が入力されているセルです。
③Rowは?
「メロン」のセルの行番号を取得しています。
「5」ですね!
全体のコードは以下のようになります。
Sub max_Row1()
Dim maxRow As Long
maxRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print maxRow
'>>5
End Sub
最下段を取得するには
このコードを使うことが圧倒的に多いです。
わたしも簡単な表であればこれでさくっと取得しています。
メリット・デメリット
このコードのメリットデメリットは以下の通りです。
例えば以下のように
表に空欄があっても取得できます。
Sub max_Row1()
Dim maxRow As Long
maxRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print maxRow
'>>7
End Sub
デメリットもあります。
例えば表の下に注釈を入れたりすると正しく処理できません。
本来は「5」になるべきが「7」になります。
Sub max_Row1()
Dim maxRow As Long
maxRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print maxRow
'>>7
End Sub
取り方2
コード
別の方法を考えてみます。
ws.Cells(1, 1).End(xlDown).Row
この方法であれば、表の下に何か入力されていても大丈夫です。
Sub max_Row2()
Dim maxRow As Long
maxRow = ThisWorkbook.Worksheets(1).Cells(1, 1).End(xlDown).Row
Debug.Print maxRow
'>>5
End Sub
メリットデメリット
メリットは以下の通りです。
デメリットは以下です。
Sub max_Row2()
Dim maxRow As Long
maxRow = ThisWorkbook.Worksheets(1).Cells(1, 1).End(xlDown).Row
Debug.Print maxRow
'>>2
End Sub
最右列の取り方
ws.Cells(1, Columns.Count).End(xlToLeft).Column
基本的には最下段と同じ考え方です。
- Cells(1, Columns.Count)でシートの最右列(最終列)を取得
- そこから左に向かって最初に入力されているセルを取得
- 取得したセルの列を取得
Sub max_Col()
Dim maxCol As Long
maxCol = ThisWorkbook.Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
Debug.Print maxCol
'>>4
End Sub
【大事】エクセルにおけるシートの使い方、表の考え方
最下段の取り方はどちらがいいか?
基本的には方法1を使うのが一般的です。
が、それ以前に
エクセルにおける表の扱い方で
覚えておかなければいけないことがあります。
エクセル、特にVBAを取り扱うためには
以下のことを意識すると壊れにくいプログラムが作れます。
- エクセルシート1枚に対し、
基本的に表は一つ - 欄外にコメントは書かない
表はデータを保存、参照する目的で作成するので
余計なものはいれない。複雑にしないが鉄則です。
非表示の場合うまくいかない
表が非表示の場合、
表示されている行や列を最下段、最右列として処理し、
正しく端っこを取得することができません。
これまで紹介した方法は一般的な方法で
私もよく使いますが、うまくいかないケースもそれなりにあります。
私は以下のように使い分けています。
- ちょっとした表(フィルターとかかけない)であれば
上記方法で十分 - 大規模かつデータベースのように
保存や追記が必要な表に関してはテーブル化して取り扱う
テーブルについては次でご紹介しますので
見て頂ければと思います。
テーブルを使用した場合の方法
データの末端を取得する理由はデータの追加
そもそも最下段、最右列を取得する理由はなんでしょうか?
ちょっとした表であれば上記のような End(〇〇) で対応できますが、
大規模かつ、データの追記や保管を頻繁に行うのであれば
テーブルを使いましょう
テーブルはデータを追加することが得意
テーブルはデータを追加することが簡単にできます。
行の追加
同じ表ですが、テーブル化させております。
ここに
果物:ブドウ
単価:300
個数:2
小計:600
というデータを追加させるとします。
何度も言いますが、
表の末端を取得する理由の多くはデータの追加のため
表の末端事態はどうでもよく、
末端にデータを追加することを目的としてコーディングします。
Sub test_table()
Dim table As ListObject
Set table = ThisWorkbook.Worksheets(1).ListObjects(1)
With table.ListRows.Add
.Range(1).Value = "ブドウ"
.Range(2).Value = 300
.Range(3).Value = 2
.Range(4).Value = 600
End With
End Sub
列の追加
列の追加も簡単です。
Sub test_table_col()
Dim table As ListObject
Set table = ThisWorkbook.Worksheets(1).ListObjects(1)
table.ListColumns.Add.Name = "備考"
'必要なら新しく作った「備考」列に追加するデータを作成
'長くなるので今回は省略
End Sub
テーブルは表管理には必須の技術
改めておさらいですが
私は何らかのシステムをVBAで組むとき
- 簡単な表の場合は
End(〇〇)方式で最下段、最右列を取得 ⇒データ追加 - データベースっぽく管理したい場合は
テーブルにして管理
最初は①の方法でも十分ですが、
大きな仕組みを作るようになってきたら
早いうちにテーブルを取り扱えるようにしておくとよいです。
テーブルは便利なツールですが、
少し癖もあるために使いやすくするように独自の関数も作って紹介しています。
もしよければご参考にしていただければと思います。
VBAの学習方法をまとめました。
VBAを高コスパで、短期間で学ぶにはUdemyがおすすめです。
Udemyは良質の学習プラットフォームですが、
動画数が多すぎてどれを見ればよいか迷います。
おすすめの講師をまとめました。