【Excelマクロ】最終行の取得

Excelマクロ

最終行の取得について

マクロを作成する際に、データの全てに対して処理をすることがあります。

関数でも似たような処理をしますが、関数を作成し、反映させたいところにコピーをすると思います。

ただ、マクロではコピーする、という概念がないので、「1行ずつ処理をして、結果を出す」という考え方が一般的です。

そのため、A〜E列の合計をF列に出したい場合にも、関数ではあればF列に「SUM関数」を使って利用すると思いますが、マクロでは、「A〜Eの合計をF列に出す」というコードを記載して、合計を出します。

これは全体ではなく、1行の合計を出すのが一般的だと思うので、A〜E列の合計を出して、「同じ行のF列に合計を出す」というコードを考えていきます。

その際に必要なのが、「どこの行までその作業をするのか?」ということです。

これについては、今回説明する「最終行の取得」が重要になってきます。

最終行を利用する場面

例えば、次のような処理を行う場合に最終行を利用します。

  1. A列に〇があれば、その行を赤背景にする。
  2. A列が「出荷」、B列が今日の日付であれば、その行を黄色背景にする。
  3. 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で頻繁に使われるコードの一つです。

定型のコードがあるので、コードの形を覚えて、スムーズに使えるようになりましょう。

  1. 基本形: Cells(Rows.Count, 列番号).End(xlUp).Row
    列番号を変更することで、任意の列の最終行を取得できます。
  2. 繰り返し処理: 最終行を利用して、ループ処理を効率的に行うことが可能です。
  3. 応用: 最終行の1行下にデータを追加する際には、最終行 + 1を利用します。

コメント