VBAで最終行・最終列を取得する方法を知っていますか?最終行・最終列の取得は、VBAが組める人でも、使いこなせている人は少ないと思います。
Excelのリスト処理でデータの増減に対応するには、正しい最終行の取得が必須です。本記事では、初心者でも簡単に理解できる方法を解説します。
最終行・最終列の取得コードは基本的でありながら、様々な表現方法があります。その為、思った通りに動作しないこともよくあります。そんな初心者がつまづきやすい最終行・最終列の取得について、解説していきます。
様々な取得方法がありますが、初心者が覚えておくべき内容は一つだけです!要点を押さえて、効率的に学べるようにしていますので、ぜひこの記事を参考にしてください!!
このサイトでは、効率化に関する様々な情報を発信しています。コピペで使えるVBAも紹介していますので、コチラも参考にしてみてください!
目次
【用途】VBAで最終行・最終列を取得する場面
最終行・最終列の取得コードは、必ずと言っていいほど登場する、重要なコードになります。例えば、以下のようなメールの自動送信VBAにも、最終行の取得は必要です。
リンクのVBAでは、宛先・本文リストを元にOutlookでメールを作成しています。1行目の宛先・本文のメールを作成し、2行目・3行目…とリストの一番上から順番にメールを作成しています。
その最後が何行目なのかを知るために、最終行の取得が必要です。
また、データを定期的に追記するコードを実行する場合でも、最終行の取得が必要です。一番下を毎回取得する為に、最終行の取得コードが必要です。
このようにエクセルにとって、最終行の取得はスタートやゴールを決める、重要な考え方です。
【コピペOK!】最終行・最終列の取得コード
最終行・最終列の取得ですが、サイトや教本によってさまざまな方法が紹介されています。
ただ、初心者の方がコードを組むにあたって、覚えておくべき方法はそれぞれ一つだけです。
<最終行(一番下)の取得>
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
※A列の一番下を取得するとき
<最終列(一番右)の取得>
MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
※1行目の一番右を取得するとき
このコードについて、詳しく解説していきます。
【コード解説】VBAで最終行・最終列を取得する仕組み
VBAのコードを読む時は、「.」を「の」と読み替え、「.」で区切って読んでいきます。
3-1.最終行の取得のコード解説
『Cells(Rows.Count, 1).End(xlUp).Row』の、「.」を「の」読み替えていくと次のようになります。
Cells(Rows.Count, 1).End(xlUp).Row
→Cells(Rows.Count, 1) の End(xlUp) の Row
これを具体的に解釈していきましょう。
まず、Cells・End・Rowという3つの英単語には、それぞれ次のような意味があります。
Cells(Rows.Count,1) = 1列目(A列)の一番下
End(xlUp) = 一番上
Row = 行数
すなわち「1列目(A列)の一番下から見て、一番上のセルの、行数を計算」というコードになります。なお、一番下から見た一番上のセルは、リストの一番上のセルです。
ここから一つずつコードの意味を確認していきます。
Cells(Rows.Count,1) = 1列目(A列)の一番下
「1列目(A列)の一番下」とは、エクセルの一番下のセルの位置です。
なおCell関数は、セルの場所を指定するために使います。詳しい指定方法は、以下の別記事を参考にしてください。
End(xlUp) = 一番上
End(xlUp)は、かっこの中によって上下左右を決めています。Upの部分を変えると、始まりのセルの場所から上下右左の一番端の場所を表すことができます。
Row = 行数
最後の“Row”は、行数を表します。(上から何番目か)つまり、日本語で表すとこのようになります。
Cells(Rows.Count, 1).End(xlUp).Row
→Cells(Rows.Count, 1) の End(xlUp) の Row
3-2.最終列の取得のコード解説
先ほど解説した最終行の取得(一番下)との違いは、Endの中身と最後のColumnです。最終列の取得コードを分解すると次のような意味となります。
Cells(1, Columns.Count) = 一番右端のセル
End(xlToLeft) = 一番( 左 )
Column = 列数
このように、End()のカッコの中身が一番左に変わります。
また今回は列数(左から何番目か)を知りたいため、Columnを使用します。先ほどは行数(上から何番目か)を取得するためRowをしていました。
よって、最終列取得コードは次のような意味になります。
Cells(1, Columns.Count).End(xlToLeft).Column
→一番右のセル の 一番左 の 列数
3-3,Endについて
End(方向のコード)で、Ctrl+矢印と同じ動きをします。上下左右の方向コードについては以下となります。
| .End(xlUp) | Ctrl + ↑ |
| .End(xlDown) | Ctrl + ↓ |
| .End(xlToRight) | Ctrl + → |
| .End(xlToLeft) | Ctrl + ← |
これらの方向コードを使うことで、一番端のセルの位置を取得することができます。始まりのセルからCtrl+矢印キーで移動するときと同じ動きです。
【注意】VBAで最終行・最終列を取得する際のエラー対策
4-1.リストは、スタートからゴールまでが2行以上になるようにする
End()で行っている処理は、Ctrl+矢印キーの動作になります。
その為、1行しかないセルで行うと、エクセルがフリーズする原因となります。これは、何もないエクセルの端まで処理をしてしまうためです。ループの処理であれば、何万回と繰り返すことになります。
その為リストは、必ずスタートからゴールまでが2行以上になるようにしてください。
ただ、日によって行が変化するリストだと、日によっては1件の時もあるかもしれません。メールマクロの例でも、一斉送信したい連絡先が1件しかない場合もあると思います。
1行だけにならないようにする対策として、行タイトルを必ず作ることを心がけましょう。
行タイトルをつけていれば、必ず行数はスタートからゴールまでが2行以上になります。
4-2.スタートからゴールまでの間に、空欄・結合を作らない
End()はCtrl+矢印と同じ動作です。その為、スタートからゴールまでの間に空欄があると、処理が止まってしまいます。
VBAを使うリストでは、空欄は避けるようにしましょう。また、セルの結合も空欄として扱われるため、セルの結合も行わないように注意しましょう。
4-3.フィルタ/非表示がないかを確認する
VBAはフィルターや非表示で見えていない部分にも、動作を行います。なので、見えていないセルに不要なデータがあれば、そのデータを処理してしまいます。
誤動作を防ぐためにも、フィルターや非表示がないか必ず確認しましょう。そもそもVBAがあるリストでは、フィルター/非表示を使わないことをお勧めします。
フィルターや非表示を使う場合、別のブックやシートに転記するようにしましょう。
最後に
今回は最終行と最終列の取得のコードについて解説を行いました。
最終行・列の取得については、他の教本やサイトなどで様々なやり方が紹介されています。どんな状況でも使えるように、複雑になっている物もちらほら紹介されています。
ただ、初心者のうちは、リストの基本的な作成に重点を置くことが大切です。はじめはどこでも使える複雑なコードを覚えても、リストの作成で躓くことが殆どです。空欄があったり、フィルターで誤作動を起こしたり、そもそものコードを打ち間違えていたり…そんな時、複雑なコードはエラー箇所の解読を長引かせる原因にしかなりません。
はじめは単純なコードを使い、動きを見ながら、コードを書いていくのが一番です。その為今回は、このコードを一つだけ紹介させていただきました。
その他VBAの勉強法としては、別途記事でパラシュート式勉強法を紹介しています。是非そちらも参考にして、VBAをスキルとして習得し、効率化をしていってください!

