VBA再入門表の先頭から最終行まで繰り返す(ForとEnd(xlUp).Row)
数十行、数百行程度なら、スクロールして最終行を目視で確認できますが、 数万行あったら、スクロールも面倒です。 そういう時は、 A列の適当なセル(A1セルで良い)を選択して、 Ctrl + ↓ とすれば、連続データの最終行に飛んでいきます。 上記の表なら、 A1セルで、 Ctrl + ↓ A11セルに選択セルが移動します。 これなら、データが何万行あっても、一瞬で最終行に移動できます。 これをマクロVBAで書くと、
Cells(1, 1).End(xlDown)このように書きます。 ですが、A列の途中に空白セルがあると、そこで止まってしまいます。 Ctrl + ↓ これを何度も押して、一番下に移動した経験がある方も多いのではないでしょうか。 つまり、上のコードでは、ちゃんとした最終行を取得できません。 また、もし1行目の項目名しかないと、 Ctrl + ↓ これでは、シートの一番下の、1048576行まで行ってしまいます。
ではどうしたら良いか・・・ シートの一番下の行から、 Ctrl + ↑ これで、データの入っている最終行で止まります。 つまり、 A1048576のセルから、 Ctrl + ↑ これで間違いなく、データの最終行に移動できます。 これをマクロVBAで書くと、
Cells(Rows.Count, 1).End(xlUp)このように書きます。 Rows.Countは、 1048576 という数値と同じ意味です。 シートの一番下の行の数値、つまり、シートの全行数を取得しています。 ですので、 Cells(1048576, 1).End(xlUp) これと同じことになります。
.End(xlDown) .End(xlUp) これらが、 Ctrl + ↓やCtrl + ↑ これらを意味します。これで最終行のセルは分かりました。 しかし、これはあくまで最終行のセルです、箱としてのセルそのものです。 行数ではありません。 セルの行数は、 .Row と付け足すと、ぞのセルの行数が取得できます。 つまり、 A1048576のセルから ・・・ Cells(Rows.Count, 1) Ctrl + ↑で移動したセル ・・・ .End(xlUp) の行数 ・・・ .Row という事です。
Cells(Rows.Count, 1).End(xlUp).Row このように書くと、最終行の行数になります。 最初の画像の表なら、 Cells(Rows.Count, 1).End(xlUp).Row これは、 11 にまります。 つまり、 Cells(Rows.Count, 1) これは、 A1048576セルの事で そこから、 .End(xlUp) そのセルからCtrl + ↑で移動したセルの.Row行番号という事です。 表の最終行まで繰り返す そこで、前回の繰り返し処理のFor i = 2 To 11 この終了値の 11 を Cells(Rows.Count, 1).End(xlUp).Row これに取り替えることで、 (デー件数が変わっても)常に最終行まで処理されるようになります。
このようにすることで、常に最終行まで処理されます。 実際に、データを追加したり、削除して、 ちゃんと最終行まで計算されることを確認してください。 VBAの文法を覚える必要があるか 上記の最終行取得のVBAコードを説明しようとすると、かなり難しい文法説明が必要になります。 VBAを書くだけなら、上記のコードをコピペすれば済むことです。 オブジェクト、プロパティ、メソッド ここを訪れるまでに、書籍やネットでVBAを勉強したことある人は、これらの言葉で挫折した人も多いのではないでしょうか。 オブジェクトとは 対象物です。 ほとんどのオブジェクトは、マウスで操作できるもので、そのマウスで操作する対象の事です。 エクセルの代表的なオブジェクトと言えば、ブック、シート、セルという事になります。 プロパティとは オブジェクトの属性・状態・様子といったものになります。 オブジェクトを物体としてとらえると、その物体の状態を表すという事です。 メソッドとは オブジェクトに動作を与える命令です。 オブジェクトに対して、こう動作しろ、こうなれ、と命令するという事です コレクションとは 同一のオブジェクトの集まりです。 多くの場合、オブジェクト名称を複数形にした名前になっています。上記の最終行取得のコードを、これらの用語を使って説明しても簡単に理解できるものではありません。 そのような説明を聞いて理解できるなら苦労しないし、ここには来ていないはずです。 こういう事をちゃんと覚えるのは後回しにしましょう。 今の段階では、用語としてそういう言い方をすると、それだけの理解で十分です。
マクロを書くのに、このようなオブジェクト、プロパティ、メソッドが何で、どういうものかなどという事は、知らなくても書けます。 しかし、書籍やネットを見れば、このような用語が出てきますし、 エクセルも、書き間違えてエラーを起こすと、これらの言葉で注意します。 その時に、何の事かが分からないと困ってしまいます。 逆に言えば、そのような時に困らなければ、それで十分だという事です。
本当に詳しい話、本質を語れば、 そもそもオブジェクト、プロパティ、メソッドの違いなんて、ほとんど大した違いはありません。 VBAでの使い方・書き方の違い程度の事でしかないのです。オブジェクトは、階層構造になっていて、オブジェクトの中にオブジェクトがある。 (あらゆる物体は、より小さな物体の集まりです) オブジェクトは、プロパティとメソッドの集合体である。 (どういう物体かをプロパティが決めていて、メソッドでその物体は動かせる) このようにイメージしてください。
これらの用語については、後の回にもう少し詳しく解説します。 ExcelマクロVBA入門等の対応ページ 第18回.最終行の取得(End,Rows.Count)・エクセルVBAにおける最終行取得の必要性 ・.End(xlDown):Ctrl+↓ ・.End(xlUp):Ctrl+↑ ・Endプロパティの方向(↑↓←→)について ・セルの行数を取得するRowプロパティ ・Cells(Rows.Count, 1).End(xlUp).Rowを日本語に訳す ・EndプロパティがRangeオブジェクトを返す ・Endプロパティの問題点 ・最終行に関するサイト内のページ
オブジェクト式について ・オブジェクト式の書き方 ・オブジェクトは直接指定できない ・オブジェクト式の書き始めは何か ・メソッドとプロパティの違いについて ・オブジェクト式の最後に 同じテーマ「マクロVBA再入門」の記事 新着記事 NEW ・・・新着記事一覧を見る アクセスランキング ・・・ ランキング一覧を見る このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。 掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。 本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。 This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.