【Excel VBA】最終行の取得、最終列の取得 – 一番下の行ってどう書くの?

Excel マクロ(VBA)

今回は、ExcelのVBAで最終行・最終列を取得するためのコードを解説します。

スポンサーリンク

最終行の取得とは

今回は以下の表を例に説明します。この表では、1行目がラベル行になっていて、2行目以降に個々のデータが掲載されています。社内のシステムからこういったExcelデータやcsvデータをダウンロードして作業するような業務を行っている人も多いのではないでしょうか。

こういった表データは往々にして、行数が毎回異なると思います。ある時は100行目まであるデータが、ある時は200行存在するようなケースが容易に想像できます。

このような業務をVBAで自動化しようとする時には、”1行目から最終行目まで”を選択したり削除したりするために、最終行が何行目なのかをVBAに調べてもらう必要があります。これが、最終行の取得です。

スポンサーリンク

最終行の取得方法

早速ですが、最終行を取得するための便利なコードを以下に示します。

Dim lastrow As integer ‘変数の宣言

lastrow = Cells(Rows.Count, 1).End(xlUp).row ‘最終行の取得

上の2行で、変数を宣言した後、最終行の行数を取得して、それを整数型の変数に格納しています。以下で解説します。

変数の宣言

まず1行目は、変数の宣言です。変数というのは、様々なデータが入る可能性がある”箱”のようなものです。今回の例でいうと、最終行が”100″かもしれないし、”200″かもしれないけれど、最終行が何行目であっても、その値を入れられるように、箱をあらかじめ用意しておくということです。以下の図は変数のイメージ図です。

また変数の型というのは、”箱”である変数に、どんなデータを入れるかを示します。今回でいえば、行数を扱うので、100とか200のような整数が入ります。整数を入れられる箱を用意する、というイメージです。integerというのが整数という意味です。変数の型というのは難しい概念ですが、整数型以外でイメージしやすい変数の型の例としては”文字列”があります。以下は変数の”型”のイメージ図です。

纏めると、Dim lastrow As integerというコードは、lastrowという変数(からの箱)を整数(Integer)を入れる用途で使いますよ、という宣言と言えます。

最終行の取得

lastrow = Cells(Rows.Count, 1).End(xlUp).row

では続いて、最終行を取得する部分のコードについて解説します。lastowは、上で宣言した変数、つまり整数のデータを入れるための空の箱です。この空の箱に入れるデータが、”=”以降の部分です。

まずCells(x,y)という形で、セルの場所を指定できます。xは行番号、yは列番号です。例えばCells(1,2)であれば1行目の2列目、つまりB2セルを表します。上のコードではCells(Rows.count, 1)と記述されています。列がA列であることがわかりますが、Rows.Countというのは、行の数を数えるという意味です。言い換えると、Excelの行を全て数える、Excelで使うことのできる最も下の行の行数を取得することになります。この値は、Excel2007以降であれば約100万行目です。

次に出てくるのが”.End(xlUp)“です。まず”.End“は、一番端のセルを参照します。端と指定するだけでは上下左右どこの端なのかわかりませんが、(xlUp)と書いてある通り、上側の端です。またこの時の上端というのは、ショートカットのCtrl + ↑を使うときと同じで、スタート位置が空白セルの場合には、空白ではないセルが初めて出てきたセルを”端”とします。上でスタート位置をCells(Rows.Count, 1)と指定していて、これがExcelの一番下の行(約100万行目)で、事実上は空白となっているはずですので、スタートが空白セルとなります。

これらを合わせると、今いるセルから、一旦A列の100万行目に移動。その後そこから上に移動していって、初めてデータが入力されているセル、つまり、実質上の最終行を指定することになります。イメージとしては以下の通りです。

そして、最後に登場するのが”.row“です。これは、行数を取得する、という意味です。上の例でいえば、”169″という行数が整数で取得されます。これが”lastrow”という変数に格納されます。ここまでを全て纏めると、以下のコードになります。

lastrow = Cells(Rows.Count, 1).End(xlUp).row

A列以外の列の最終行を取得

上記の例ではA列の最終行を取得しましたが、以下のようなレイアウトの表の場合にはどうでしょうか?

表がB列から始まっていますが、Cells(Rows.count, 1)というコードはA列の一番下の行を取得しますので、このままでは使うことができません。

修正方法としては、Cells(Rows.count, 1)の”1″の部分を必要に応じて変更します。B列の最終行を取得する場合であれば”2″とし、C列なら”3″とします。B列の最終行を取得するコード全体としては、以下のようになります。

lastrow = Cells(Rows.Count, 2).End(xlUp).row

最終列の取得方法

上では最終行を取得するためのコードを示しましたが、最終列を取得したい場合もあると思います。その場合のコード例を示します。

Dim lastcolumn As integer ‘変数の宣言

lastcolumn = Cells(1, Columns.Count).End(xlToLeft).Column ‘最終行の取得

考え方は最終行と同じです。初めの1行は変数の宣言。続いてその変数に格納するのがCells(1, Columns.Count).End(xlToLeft).Columnという部分です。

Cells(1, Columns.Count)は、1行目の一番右端の列のセルです。そこから、.End(xlToLeft)で左端に移動しますが、スタート位置が空白セルのため空白ではないセルが初めて出てきたセルを”端”とします。以下のイメージ図の通りです。そして、.Columnでそのセル位置の列数を取得します。以下の例では、I列、整数に直すと”9″です。

1行目以外の列の最終行を取得

最終行の取得と同様に、最終列の取得でも、1行目以外の最終列取得が可能です。以下は3行目の最終列取得のコードです。行数に該当する部分の数値を必要に応じて変更してお使いください。

lastcolumn = Cells(3, Columns.Count).End(xlToLeft).Column ‘最終行の取得

コメント

タイトルとURLをコピーしました