最終行の取得について
マクロを作成する際に、データの全てに対して処理をすることがあります。
関数でも似たような処理をしますが、関数を作成し、反映させたいところにコピーをすると思います。
ただ、マクロではコピーする、という概念がないので、「1行ずつ処理をして、結果を出す」という考え方が一般的です。
そのため、A〜E列の合計をF列に出したい場合にも、関数ではあればF列に「SUM関数」を使って利用すると思いますが、マクロでは、「A〜Eの合計をF列に出す」というコードを記載して、合計を出します。
これは全体ではなく、1行の合計を出すのが一般的だと思うので、A〜E列の合計を出して、「同じ行のF列に合計を出す」というコードを考えていきます。
その際に必要なのが、「どこの行までその作業をするのか?」ということです。
これについては、今回説明する「最終行の取得」が重要になってきます。
最終行を利用する場面
例えば、次のような処理を行う場合に最終行を利用します。
- A列に〇があれば、その行を赤背景にする。
- A列が「出荷」、B列が今日の日付であれば、その行を黄色背景にする。
- A列が特定の条件(例:都道府県ごとにシートを分けるなど)を満たす場合、シート2にそのデータを反映する。
このような処理を効率的に行うために、最終行の取得は欠かせない方法です。
最終行の取得方法
最終行を取得するためのコードはコピペで使うぐらいよく利用するので、次のコードはぜひ覚えて欲しいです。
Cells(Rows.Count, 1).End(xlUp).Row
このコードの構成についてもう少し詳しく説明します。
① Cells(Rows.Count, 1)
最初はCellsとあるようにセルを指定しています。ここで考えているのは、最終行を取得するにあたり、Excelで本当の最終行を取得し、そこから上に探してきたときに、一番初めにデータがある場所、それが「データがある最終行」になります。
通常の操作でいう「Ctrl + 矢印」を押す方法で、上方向に探すと言うのは「Ctrl + 上矢印」になります。
これを実現するために、このコードを初めに書きますが、具体的な内容としては次のとおりです。
Rows.Count
: シートの最大行数を表します。Excel 2007以降では1,048,576行(以前は65,536行)。Cells(Rows.Count, 1)
: 最大行(1,048,576行目)のA列(1列目)を指定
今回の例でいくとExcelは2007行こうとすると「Cells(Rows.Count,1)」は「Cells(1048576,1)」となるのでセル「A1048576」を指します。
もちろん、列を変える場合には、1
の部分を2や3にすればB列やC列になります。
データが全て入ったときに一番最後にデータがある「列」を指定するようにしましょう。
※A列のデータは入れる場合と入れない場合があるが、B列は必須の内容なのでデータがある場合には必ず入れる、という場合にはB列を指定した方が、確実に最終行を取得できる、と言うことです。
② .End(xlUp)
Excelで一番最後のセルの指定はわかったかと思いますが、そこから上に探してくる(Ctrl + 上矢印)の操作を表現するのが「End(xlUp)」です。
End(xlUp):指定したセルから上方向に検索を行い、最初にデータが存在するセルを取得します。
例えば、A列の最下行「A1048576」から上に向かって検索し、データがある最初のセルが「最終行」となります。
今回は上方向への検索なので、「xlUp(上へ)」ですが、もちろん、「xlDown(下へ)」「xlTpRight(右へ)」「xlToLeft(左へ)」もあります。
③ .Row
最後のRowですが、なくても、A列の最終の「セル」は取得できますが、 For〜Nextなどで使う場合には、1行目から最終行まで処理したい!と言うことが多いので、この最終行というのが「行番号」でないといけないので、よく使うのは「行番号」です。
最終行のセルの行番号を取得するために、この「Row」を入れます。
Row:セルの行番号を取得します。
変数に入れての利用例
次のコードはA列の最終行を取得し、変数に入れています。
Dim last_rw As Long
last_rw = Cells(Rows.Count, 1).End(xlUp).Row
このコードで「last_rw」という変数に、A列の最終行の行番号が代入されます。
応用例
最終行までループ処理を行う
内容としては、最終行を「last_rw」の変数に入れます。
その後、For構文(繰り返し処理)を使って、1行目から最終行(last_rw)までA列が◯かどうかを判断し、丸だった場合には赤背景にする、という例になります。
Dim last_rw As Long
Dim i As Long
last_rw = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To last_rw
If Cells(i, 1).Value = "〇" Then
Cells(i, 1).Interior.Color = RGB(255, 0, 0) ' 赤背景
End If
Next
最終行の1行下にデータを追加する
最終行のすぐ下にデータを追加するコードです。
Dim last_rw As Long
last_rw = Cells(Rows.Count, 1).End(xlUp).Row
Cells(last_rw + 1, 1).Value = "新しいデータ"
まとめ
最終行の取得はVBAで頻繁に使われるコードの一つです。
定型のコードがあるので、コードの形を覚えて、スムーズに使えるようになりましょう。
- 基本形:
Cells(Rows.Count, 列番号).End(xlUp).Row
列番号を変更することで、任意の列の最終行を取得できます。 - 繰り返し処理: 最終行を利用して、ループ処理を効率的に行うことが可能です。
- 応用: 最終行の1行下にデータを追加する際には、
最終行 + 1
を利用します。
コメント