ついて回るのが「最終行の自動取得」です。処理を実行する範囲を決めないといけません。入っているデータの形も様々です。最終行の取得方法も、シートのレイアウトによって使い分けなければいけません。初心者向けのものから応用の効く手法まで幅広く用意しましたので、お好きなものをお持ち帰りください。英語+日本語で命名するひとつの関数に複数の動きをしてもらうワークシートの使用範囲の最後行UsedRangeプロパティまずは最も基本的なコードから。ワークシート.UsedRangeこのコードで、「ワークシートで使われている範囲」を取得できます。Range("B2:E8")と同じもの)を取得することができます。ここから「最終行番号」を取得しましょう。Worksheets("データ").UsedRange.Rows.CountこれでUsedRangeの行数がわかります。ここで注意が必要です。Rows.Countで取った行数には、上部余白の1行目がカウントされません。1これがUsedRangeの上部余白の行数となります。この2つを足して、「最終行番号を取得するコード」はこちらが完成形です。1と親シートを変数に入れてしまうと読みやすくなって良いでしょう。~~Nextこのように、データが何行入っているかを自動で取得して動くマクロが作れますね。UsedRangeはプログラムの動きが分かりやすく、落とし穴があまりないので、1つだけ覚えて帰るのであれば、こちらをおすすめします。コードを書くときに気を付ける点としては、VBAにしては珍しくActiveSheetが省略できません。1といってもそもそもActiveSheetを頼ったコードは結構あぶないので、UsedRangeだけでなく、RangeやCellsの親シートも省略しないようにしましょう。ActiveSheetを処理するマクロは途中ユーザーのクリックひとつでバグりますので、こう書くように癖をつけてください。ちなみに最終列もほとんど同じコードで取得可能です。冒頭の通り「最終行の取得」にはいろいろな書き方があり、どれがいいというわけではなく一長一短です。書式が設定されている最終行を持ってきてしまいます。「使用中の最終行」なんですね。この表の欄外に注釈のテキストなどがあっても、UsedRangeはエリアを広く取りすぎてしまいます。この方法で最終行を取得する場合は、シート全体のレイアウトにご注意を。いっても、そこまで恐れる必要はありません。ここにメインの処理を書くと、ループ中のIf文で「データがあるか」を判定するだけで対応できます。ちなみに「列全体を書式設定」していても、UsedRangeはシートの最下部1048576を取得したりはしません。全体に一括の書式設定をした場合は、それはUsedRangeと見做されない仕様です。特定の列の入力最終行Endプロパティ続いて、「ある列でどこが最終行か」を調べるコードを紹介します。売上が入っている最終データ「7」を持ってくる場合に使います。+↑↓←→の「区切りのセルまで飛ぶ」機能を利用します。VBAでこの機能は「セル.End(方向指定)」で呼び出すことができます。空白セルがあるとそこで止まってしまいますので、すごく下のセルから上方向に飛ぶ手法を使います。これを用いて、最終行を取得するコードがこちらです。取得したセル.Rowで、その行番号を取得すれば最終行取得は完了です。このE1000000がちょっとカッコ悪いですね。いう「多分大丈夫そうなでっかい数字」を使うのは、ダメプログラマあるあるでよく挙げられてる行為です。Excel2025とかで1億行までOKになったらバグるかもしれませんしね。いうことで、カッコつけるとこんな感じになります。「ワークシート.Rows.Count」はシートのすべての行数をカウントします。5)は"E1048576"を指します。このように、「ある列の入力最終行」が欲しいときには、UsedRangeプロパティではなくEndプロパティを利用しましょう。↓では空白で止まってしまう」と注意しましたが、この仕様を逆に利用したい場面もあります。↑こんな表で、4月の表の最終行を取得する場合です。Range("B3").End(xlDown).Rowこれで5月の表を無視して↑の表の最終行「8」を取得することができます。上の表に空セルがあったらダメと言うことは忘れずに。Endプロパティの落とし穴さてこのEndプロパティさん、実は結構危ないやつです。「表の下の余白部分になにかテキストがあるとそこで止まってしまう」というのがすぐに思いつく罠ですが、それよりはるかに恐ろしい罠が...。言い換えれば「オートフィルター中の表には使ってはいけない」ことです。↑この表でEnd(xlUP)を使うと「6」が返ってきてしまいます。オートフィルターとは関係なく全行を処理したいときに、7~8行目が無視されてしまうバグになりますね。使用する際はオートフィルターをクリアしてから実行しましょう。Ifを直前に書いておけば、この落とし穴は半分は回避可能です。半分、行自体を手で非表示にされている場合はどうしようもありません。小ネタ:とても有名なEndさんさてこのEndプロパティさん。こんなに癖がある割にかなり有名で、現在のVBA界では不動のスタメンです。vba」で検索すると、UsedRangeよりはるかに多くの記事が出てきます。今日もどこかで誰かがオートフィルターの魔の手にかかっています。́・ω・`)私はVBA歴が浅いので、なぜこっちが主流なのかは分かりません。1).End(xlUp).Rowシートを指定する方法を学ぶ前だと、Endの方が短くて教えやすいのかな?ですがUsedRangeは書き方がとても素直です。初心者にとってもUsedRangeの方がいい気がするんですけどね。加えてUsedRangeは知識としての価値も高いです。Endプロパティは最終行以外だとめったに使わない手法ですが、UsedRangeで使った「セル範囲の行数・第1行を求める」手法は、これからVBAを学んでいく上で、肝となる重要なプロパティです。私はUsedRangeの採用をおすすめします。「Endで書かれた他人のコードを読む」という大事な役割があります。「UsedRange」「End」の2プロパティを紹介しました。この2つはこれから一生使います。VBAを始めたばかりの方は、ここまでの内容をまずしっかりマスターしてください。劇的にマクロの作成効率を上げる方法があります。それは最終行を取得する自作関数を作ることです。関数を作ると聞くと難しく感じるかもしれませんが、この最終行の取得に関しては、作成がものすごく簡単です。ここに行ごとの処理を書くNext見てわかる通り、関数も中身はたった1行で、しかも中身は上で紹介した基本のコードそのまんまです。こんな簡単な関数ですが、使用例を見ればわかる通り、すごく便利です。コード自体も短いですし、なによりこのコードが「データシートの最終行を取得している」ことがもはや文章のように読めるようになっていますね。Endプロパティを関数化したものがこちら。LastR_売上列)こちらもものすごくわかりやすくなりますね。読みやすさに加えて、コードを暗記しなくてよくなるのもかなり重要なメリットです。この関数だけコピペしておけば、そのブック内ではもうUsedRangeやEndを書く必要がないということですからね。関数は「複雑な処理のためのもの」と思っている方がいらっしゃいましたら、それは誤解です。理解しやすく、作りやすく、使いやすい関数になります。Getシート最終行のように目的がはっきりしているコードで学ぶ関数は案外簡単です。関数に苦手意識があった人も、これをきっかけに是非勉強してみて下さい。指定したセル範囲(Rangeオブジェクト)の最終行ここからいろんなパターンを紹介していきます。「指定したセル範囲の最終行」を取得しましょう。Range("B2:E8")というセル範囲から、8を求めるシンプルなコードです。そのコードがこちらです。Functionなんてことはない、さっきのUsedRangeと同じ理屈のコードですね。1」で、最終行を求めています。これで、Range("B2:E8")という範囲から、8を求める関数ができました。なんでそんな単純なものを?と思ったかもしれませんが、これが素晴らしく便利なのです。作るマクロのレベルが上がると、Rangeオブジェクトを頻繁に扱うようになります。「ExcelVBAの極意はRangeオブジェクトをいかに扱うか」と言っても過言ではありません。「Rangeオブジェクトを渡せば、その情報を返してくれる関数」があるととても便利なのです。Getセル範囲の最終行(wsデータ.UsedRange)これで済むようになっています。格段に楽に書けるようになりましたね。「この世のすべてのRangeオブジェクトにその最終行を返すプロパティを追加出来た」ようなものなのです。万能感ありません?このように「Rangeオブジェクトを渡すと情報をくれる関数」は、作成しておくととても便利ですので覚えておきましょう。表形式データの最終行さてこの万能アイテムを手に入れたことで、どんなRangeオブジェクトの最終行も持ってこれる状態になりました。便利な最終行」と言えるわけです。「表形式データの範囲全体」を取得するプロパティを二つ紹介します。CurrentRegionあるセルを含む、表っぽい部分を自動取得してくれます。ショートカットがセットされています。普通にExcelで使えますので、試しにやってみてください。Getセル範囲の最終行(Range("B2").CurrentRegion)こう書けます。CurrentRegionによる最終行取得のメリットは、シート内に複数の表があったり、注釈テキストが余白に書いてあっても、そこそこ正確に「その表だけ」を見て最終行を取得できることです。非常に強力なプロパティですので覚えておきましょう。「どこまでがデータか」の情報はAutoFilterオブジェクトが持ってくれています。wsデータ.AutoFilter.Rangeとすることで、Range("B2:E8")を取得することができます。オートフィルターが「シートに1個まで」という仕様なので、ワークシートを指定するだけでこの範囲がもらえるのが便利ですね。コード中にセルやセル範囲の情報を書かなくてよいということです。Getセル範囲の最終行(wsデータ.AutoFilter.Range)と、こちらもかなりスッキリしたコードで最終行を取得できます。ここに行ごとの処理を書くNextと、ベタ打ちの数字やセルアドレスが一切ない完全に動的なコードが書けるようになるのがオートフィルターの強みでしょう。́∀`)┌CurrentRegion、AutoFilterの両プロパティとも、表を処理する際はとても便利なプロパティですので、是非覚えておきましょう。「書式だけの行も検知してしまう」のが落とし穴でしたね。この解決は↑のCurrentRegionを使うことで大体解決します。CurrentRegionは値の入っているセルだけを検知しますので、CurrentRegionの最終行は、必ず何らかのデータはあります。CurrentRegionが何らかの事情でうまく動かない場合は、もうがんばってやるしかなくなります。Function構造はコメントの通りです。おしりから順にCOUNTIFで空でないセルをカウントし、1個以上あった行が、「入力」最終行です。ちなみにCOUNTIFでやると、「数式の結果が""」であるものも空セルと判定します。数式もない、本当の空のセルだけを判定したい場合は、COUNTBRANK関数で書き換えてください。Excelには便利なプロパティがたくさんありますので、こういった愚直な力技はなるべく使わないようにしたいのですが、シートのレイアウトなどでどうしようもなくなる時はもちろんあります。その時は、あきらめてゴリゴリ力業コードを書いてください。関数を作ることで書きやすく&読みやすくRangeオブジェクトに情報を追加する「セル範囲の最終行」CurrentRegionプロパティによる「表の最終行」AutoFilter.Rangeプロパティによる「表の最終行」COUNTIF関数をループする「入力最終行」を紹介しました。冒頭にも書いた通り、どれがいいというわけではなく一長一短です。シートのレイアウトを見ながら、適材適所で使っていってください。実際に使うときは、利便性を追求していきたいところです。関数を「かゆいところに手が届く」ようにするためのテクニックを紹介します。Getセル範囲の入力最終行こう書いていました。すごくわかりやすいのですが、書くのがちょっと面倒ですよね。「行/列」だけは「R/C」の方が見やすいという方が多いと思います。これを解決するには、関数名を以下のように名付けます。GetLastR_値ありこうしておくことで、Get、Last、Rなどのシステムっぽい部分は英語が見やすいシート・セル範囲など実際の動きに関する部分は日本語が見やすいと、両言語のいいとこどりができて読みやすくなります。「入力候補の表示」を使うと、ここから選べるようになります。「日本語読みやすいけど書くのは面倒だな~」と思っていた方は、是非活用してみてください。関数が増えすぎると選ぶのが面倒になってきます。そんな時は、ひとつの関数にたくさんの役割を担ってもらいましょう。これだとEnd(xlUp)でB列の最終行こんな風に、列を指定したかどうかを判定し、UsedRangeとEndをハイブリットで動かせる関数を作ることができます。↑Optionalをつけた変数は省略可になる。Function引数を省略可能にするOptionalキーワードを使用することで、ハイブリッドな関数を作ることができます。研究してみてください。21:13Tweet関連記事2022-12-20セルの値からフォルダを一括で作成するセルの値を元に、フォルダを一括で作成するコードを紹介します...2022-12-06ロックされていないセルをすべて選択/クリアするロックされていないセルをすべて選択/クリアする方法を解説しま...2021-09-30テーブル(ListObject)の最終行を取得するテーブル(ListObject)の最終行取得を解説します。これはListObj...2021-09-29最終行/最終列を取得する万能関数を作るひと口に最終行と言ってもいろいろなやり方があり、UsedRange、...2021-09-28最終列を取得する方法5選ExcelVBAにおいて、最終列を取得する方法を紹介します。「日本語の変数でプログラミングすれば、みんなが幸せになれる」という思想の元、主にExcelVBAのマクロやコードを解説しているブログです。この思想については↓の記事をご覧ください。変数を日本語にすればプログラミングが上達する記事の更新通知や質問の回答はTwitterでも行っております。お気軽にフォローください。12はてなブログをはじめよう!LimeCodeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。