こんにちは!かいけつマクロです。
今回はExcelマクロをやる上での必須知識である、Cells(Rows.Count, 1).End(xlUp).Rowを解説していきます。

うっ、ナンジャコリャ。。。気持ち悪くなってきた
という方も多いと思いますが(?)、実は、全然難しくありません。
1つずつ丁寧に見ていけば、きっとスッキリ理解できるようになります!
それでは今回も張り切って学んでいきましょう!
前回の復習(For)
まずは簡単に、前回学んだ「For文」の復習からしていきましょう。
前回も見た、こちらの絵をご覧ください。


For文のポイントは、この3つでした。
- 【1回目のループ】に入るときに、iに値が代入される
- Nextに到達する度、iに1が加えられ、Forに戻る
- 「To y」のyと、iを比較して、大小関係が逆転したタイミングでループを抜ける

これだけだとよくわかんないよー
という方は、前回のブログで詳しく・丁寧に解説しているので、ぜひ、そちらをご覧ください。
データが格納されている最下部の行番号を取得する(Cells(Rows.Count, 1).End(xlUp).Row)
さて、前回の復習はこれくらいにして、いよいよ、奇天烈怪奇(?)な、こいつに挑んでいきましょう。

つくりとしては、大きく3つに分かれます。
- Excelシートの一番下の行の1列目を選択
- そこから、「Ctrl+↑」でカーソル移動
- カーソルがあるセルの行番号を取得
実際にExcelシートを見ながら、どのような動きになるかを見てみましょう。
Excelシートの一番下の行の1列目を選択

そこから、「Ctrl+↑」でカーソル移動

カーソルがあるセルの行番号を取得

この結果から分かる通り、「Cells(Rows.Count, 1).End(xlUp).Row」は、
データが格納されている最下部の行番号を取得するためのコマンドです。
ここで、少しExcelに詳しい方だと、

一番下に行きたいだけなら、Ctrl+↓でもいいんじゃない?
と思われた方もいらっしゃるかもしれません。とてもいい着眼点です!!!
・・・なんですが、実はちょっと落とし穴がありまして。。
上の図のように間に空行がある場合、最下部ではなくなってしまうんですね(T_T)
そのため、わざわざ小難しいコマンドをこねくり回して使っている、ということになります。

ちなみに、空行が入っていないことが100%確証できている、という場合は、
「Ctrl+↓」を使って、「Cells(1, 1).End(xlDown).Row」でもOKです!
余裕がある方は、ぜひこちらも試してみてください。
なんとなく、「Cells(Rows.Count, 1).End(xlUp).Row」でやっていることはわかりましたかね?

ちょっと難しかったかも。。
という方は、おそらく、「For文」と合わせて見たほうが、理解が深まりやすいと思います。
次の章では、ようやく第9講で作ったプログラムを完成させていくフェーズに入っていきます。
2021年6月の売上げ情報ファイルを、集計シートに取り込む
それでは、前回~今回までに学んだ知識を使って、実際に「売上げ情報ファイルを、集計シートに取り込む」ことをやっていきます。

いきなり来ました。こやつらです。
- For文
- Cells(Rows.Count, 1).End(xlUp).Row
1つずつ見ていきましょう。
ws.Cells(Rows.Count, 1).End(xlUp).Row
まず、「ws.Cells(Rows.Count, 1).End(xlUp).Row」の部分ですが、
もう少しかみ砕いて見ていくと、こうなります。
- ws:「2021年06月.xlsx」の1シート目(=Sheet1) ※
- Cells(Rows.Count, 1).End(xlUp).Row:データが格納されている最下部の行番号を取得する
※ブックやシートの指定ってどうやるんだっけ?という方は、こちらをご覧ください。
ということで、「2021年06月.xlsx」を開いて、上でやった、「Cells(Rows.Count, 1).End(xlUp).Row」の操作をやってみましょう。

すると、241行目にカーソルがあるので、241を取得しました。
「ws.Cells(Rows.Count, 1).End(xlUp).Row」の部分が、241に置き換わるので、
For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
↓
For i = 2 To 241
ということになります。これなら、全然難しくなさそうですよね!!
For i = 2 To 241
そして、続いては、For文を見ていきましょう。For文のポイントは、この通りでした。
- 【1回目のループ】に入るときに、iに値が代入される
- Nextに到達する度、iに1が加えられ、Forに戻る
- 「To y」のyと、iを比較して、大小関係が逆転したタイミングでループを抜ける
そのため、こんな処理になります。
- 1回目のループで、iに2が代入される
- 「Nextに到達する度、iに1が加えられて、Forに戻る」というのを、
i=2、3、4、…、241まで続ける - i=242になったとき、大小関係が逆転するので、ループを抜ける

これだけだと、いまいちイメージわかないなー
という方も多いと思うので、動かしながら、処理の流れを確認する方法をご紹介します。
ブレークポイントを設定して、1ステップずつ処理を確認する
下の図のように、左の灰色の部分をクリックしてみましょう。すると、その行が茶色に変わりましたかね。(この茶色の印を、「ブレークポイント」と呼びます。)

この状態で、いつものように、「F5」を押して、処理を実行してみてください。
すると、先ほどつけたブレークポイントのところが、黄色くなりましたかね。
実は、この黄色くなった個所で、Excelマクロの処理が一時停止しています。
そして、どこで一時停止してほしいか、ということをExcelマクロに教えてあげる役割をしているのが、ブレークポイントになります。

ここで、「F8」ボタンを押してみましょう。

つまり、動かしながら、Excelマクロの処理の流れを追っていくためには、
- ブレークポイントをつけて、
- 「F8」ボタンで1つずつ進めていく
という風にすればよいということですね!
ということで、このまま、どんどん「F8」ボタンを押していってみましょう。
上で見た、「For文」の流れが、実際に確認できると思います。
さて、ブレークポイントを使って、なんとなく処理の流れは見えたと思いますが、
「i=242になったとき、大小関係が逆転するので、ループを抜ける」
というのは、変数iの中身を見てないから、イマイチよくわかりませんよね。。。
・・・実は、変数の中身を確認する方法、あります。次の章では、その方法を解説します!
変数の中身を確認する方法①(カーソルを変数の上にかざす)
次の図をご覧ください。

このように、カーソルを変数iの上に持ってくれば、中身を確認することができます。
実際に、i=241のときとi=242の時で、動きの違いを確認してみてください!

(補足)
この「カーソルを変数iの上に持ってくる」というのが、結構技術が必要で、
微妙にずれてたりすると、反応しない場合があるので、根気強く試してみてください。
変数の中身を確認する方法②(イミディエイトウィンドウ)
また、今は、カーソルを変数の上にかざして中身を確認する方法をご紹介しましたが、もう1つやりかたがあるので、こちらもご紹介します。
その名もズバリ、「イミディエイトウインドウ」というものを使います。

また横文字出てきたよー!覚えらんないよー!!
という方も問題ありません。正直名前はどうでもいいので、使い方をしっかり覚えましょう。
まずは、VBE上で、「Ctrl+G」を押してください。こんなの出てきましたか?

そして、イミディエイトウィンドウで、このように入力し、Enterを押してください。
?中身を確認したい変数の変数名

するとどうですか?こんな感じで、変数の中身が表示されたと思います。

今まで紹介した、変数の中身を確認する方法2つ
- 変数の上にカーソルをかざす
- イミディエイトウィンドウで、変数の頭に「?」をつけてEnter
は、とっても便利で、知っているか知らないかで、プログラミングの効率が雲泥の差になります。
ぜひ、身に着けておきましょう!
売上げ情報ファイルのデータを、集計シートにコピー
さて、これまでで、For文を利用した処理の流れは確認することができました。
・・・ところで、大事なのは、
売上げ情報ファイルのデータが、本当に、集計シートにコピーされてるの?
ということですよね。
これも、ブレークポイントを利用して、1ステップずつ確認してみましょう!
まずは、1度、データを削除します。

そして、先ほどと同様に、「ブレークポイントを設定⇒F8で1ステップずつ確認」を繰り返しながら、どのようにデータが反映されるかを確認してみましょう。


こちらについては、自分の手を動かしてやらないと理解できないものになるので、

俺はやらなくてもわかるよー
という方も、ぜひ1度、自分の手で動かしながら、確認するようにしてみてください!
さて、これまでで、2021年6月の売上げ情報ファイルを、集計シートに取り込むことができました!
取込元(2021年06月.xlsx)と、取込先(集計結果.xlsm)が、一緒になっているか気になる方は、ぜひ各自で見比べてみてください。
本日のまとめ
今回は、For文を使って、実際に「売上げ情報ファイルを、集計シートに取り込む」という処理を見てきました。
「集計する」というと、何やら複雑で難しそう、というイメージを持たれるかもしれませんが、
1つ1つの処理自体は、大したことない、と思っていただけていれば、うれしいです。

ちょっと難しかったかも
という方も、大丈夫!とにかく、数をこなすことが、Excelマクロ上達の最短ルートです!
あんまり深く考えこまず、とりあえず、次のブログを読み進めていくようにしましょう。
きっと読み進めるうちに、気づいたら知識が身についていた、となっているはずです!
今回もお疲れさまでした!それでは次回のブログでまたお会いしましょう!!
- 最下部の行番号を取得するときは、Cells(Rows.Count, 1).End(xlUp).Rowを使う
- ブレークポイントを使うことで、実際に動かしながら、処理の流れを確認できる
コメント