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