Categories: VBA

VBAで最終行まで繰り返す│Excelの最終行の取得はマクロの基本

この記事では、マクロ繰り返し処理を行う場合に必須の動作「最終行の取得」について、分かりやすくシンプルに説明します。最終行の取得に関しては、非常に多用する動作であるにも関わらず、インターネット上の情報はやや複雑で分かり難いと感じます。

わたし自身、VBAを学習し始めた頃、中々、お目当ての情報に辿り着けず苦労した経験があります。

今回の記事は、可能な限り、初心者にとって分かりやすくシンプルに説明していますので、ぜひご覧ください。

この記事にアクセスしてくれた方の中には、「最終行取得の必要性」の解説を求めている方もいらっしゃると思いますので、概要も含めています。実際のコードだけお知りになりたい方は、「Excelの最終行の取得とは?」の章は読み飛ばしてください。

Excelの最終行の取得とは?

どういう時に必要か

Excelマクロを使って業務を自動化する際には、基本的に「繰り返し処理をする」業務が対象になるはずです。1回限りの業務というのは現実的に少なく、また、効率性を高めるための自動化の対象にはならないでしょう。

そして、ほとんどの場合、Excelで繰り返し処理をするということは、処理対象のレコード(行)が複数存在することを意味します。

自動化のプログラムを作成するときには、『何行目の処理をするのか』と『その処理を何回(いつまで)行うのか』を明確に定義し、プログラミングする必要があります。

つまり、「Excelの最終行の取得」とは、Excelの業務を自動化するうえで、処理対象のレコードと処理の終わりをパソコンに指示するために必須の動作なのです。

動作を組み合わせて最終行を取得する

ここは初心者にとって重要な情報なのですが、VBAでは「最終行を取得するための動作」を決められたひとつのコードで書ける訳ではありません。

同じ作業(最終行の取得)を人間が操作する場合をイメージしてみてください。基本的に、下記のような操作を行うはずです。

<人間の操作例>

  1. 最終行を取得したい列にカーソルを置く
  2. Ctrlキーを押しながら下矢印キーを押下する
A1セルにカーソルを置く
Ctrlキー + 下矢印の到着点が最終行

行数が少なければ、シートを下にスクロールして目検で調べていると思いますが、「確実な操作」は上記の通り。を前提とします。

ここがポイントです。これは、VBAに限ったお話ではありませんが、プログラミングというのは「こうして、こうする」のように動作を細分化して記述するものなのです。単に「最終行を取得する」というのは、人間にとって明確に見えても、実はプログラミングの観点では非常に曖昧な指示なのです。

例えば、パソコンが喋れるのであれば、「どうやって?」と聞き返されます。

これを実現するために、「こうして、こうする」と明確な指示を記述することが、プログラミングなのです。

Excleの最終行を取得する方法

最終行を上から取得する

Rangeプロパティ

Sub Sample()

Dim LastRow As Long
LastRow = Range(“A1”).End(xlDown).Row


End Sub

Cellsプロパティ

Sub Sample()

Dim LastRow As Long
LastRow = Cells(1,1).End(xlDown).Row


End Sub

最終行を下から取得する

基本的に、Excelの最終行の取得方法は、前記の通りですが、Excelシートのデータコンディションによっては、処理対象のレコード列の中に、本来、データが存在しているはずのセルが空白になっているかもしれません。

この場合、前記の取得方法では、最終行の判断が適切な結果にはなりません。(下図の場合、A5を最終行と判断します)

セルA6が空白になっている

それを回避するため、最終行を取得する場合には、Excelシートの最下段セル(Excelバージョンによって行数は異なる)から、上に向かって取得する必要があるのです。

<人間の操作例>

  1. 最終行を取得したい列の最下段セルにカーソルを置く
  2. Ctrlキーを押しながら上矢印キーを押下する
A列の最下段セルにカーソルを置く
Ctrlキー + 上矢印の到着点が最終行

下記は、下からExcelの最終行を取得するためのVBAコードです。なお、最下段セルは上図のように目検で確認しても構いませんが、Rows.Countを使えば、そのExcelの最下段の行数を自動的に取得してくれます。

Rangeプロパティ

<最下段セルを指定>

Sub Sample()

Dim LastRow As Long
LastRow = Range(“A1048576”).End(xlUp).Row


End Sub

<最下段セルを自動判定>

Sub Sample()

Dim LastRow As Long
LastRow = Range(“A” & Rows.Count).End(xlUp).Row


End Sub

Cellsプロパティ

<最下段セルを指定>

Sub Sample()

Dim LastRow As Long
LastRow = Cells( 1048576 , 1).End(xlDown).Row


End Sub

<最下段セルを自動判定>

Sub Sample()

Dim LastRow As Long
LastRow = Cells( Rows.Count , 1).End(xlUp).Row


End Sub

最終行までの繰り返し処理の見本

ここでは、単純な処理を見本に、実際に繰り返し処理を行うコードを書いてみます。先ほどの表のセルA2から最終行までのセルの文字を太字にするVBAコードを書いてみましょう!もちろん、最終行は人間が判定するのではなく、この記事で紹介したコードを使用します。

A2からA列最終行まで太字にする

Rangeプロパティ

Sub Sample()

Dim i As Long
Dim LastRow As Long
LastRow = Range(“A1048576”).End(xlUp).Row


i = 2

For i = 2 To LastRow
Range(“A” & i).Font.Bold = True
Next i

End Sub

Cellsプロパティ

Sub Sample()

Dim i As Long
Dim LastRow As Long
LastRow = Cells( 1048576 , 1).End(xlUp).Row


i = 2

For i = 2 To LastRow
Cells( i , 1).Font.Bold = True
Next i

End Sub

あとがき

マクロを使うにあたって、Excelの最終行取得は最も使用する構文のひとつです。

今回は、わたし自身がVBAの学習を始めた頃、「こういう解説のページがあればよかったな」と思えるようなイメージで記事を書きましたが、いかがでしたか?

少し文字数は多くなってしまいましたが、見やすさ、分かりやすさを重視したため、基本的な使い方に限定しましたが、行列を含めた複合的な使用例については、後日、別記事で紹介したいと思います。

Webs

元事務処理担当者として、プログラミングを活用した業務改善を推進している。プログラマ出身ではない事務職の現場目線で情報を発信。 その他、webs-studio.jpをメインに、複数のブログサイトを立ち上げており、合計で月間10万PVのメディア運営を行っている。 姉妹サイト一覧