VBA

【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で組むとき

  1. 簡単な表の場合は
    End(〇〇)方式で最下段、最右列を取得 ⇒データ追加
  2. データベースっぽく管理したい場合は
    テーブルにして管理

最初は①の方法でも十分ですが、
大きな仕組みを作るようになってきたら
早いうちにテーブルを取り扱えるようにしておくとよいです。

テーブルは便利なツールですが、
少し癖もあるために使いやすくするように独自の関数も作って紹介しています。

もしよければご参考にしていただければと思います。

VBAの学習方法をまとめました。

VBA(マクロ)のおすすめの学習方法 こんにちはhokkyokunです。 VBAを学ぶことで確実に業務は効率化し、余裕をもって仕事をすることができるようになります。 ...

VBAを高コスパで、短期間で学ぶにはUdemyがおすすめです。
Udemyは良質の学習プラットフォームですが、
動画数が多すぎてどれを見ればよいか迷います。

おすすめの講師をまとめました。

【Udemyは講師で選べ!】UdemyがVBA学習に最適な理由とおすすめのVBA講師 こんにちはhokkyokunです。 巨大学習プラットホームUdemyの中からVBAに関する動画について講師に焦点を当ててまとめま...