この記事では、マクロで繰り返し処理を行う場合に必須の動作「最終行の取得」について、分かりやすくシンプルに説明します。最終行の取得に関しては、非常に多用する動作であるにも関わらず、インターネット上の情報はやや複雑で分かり難いと感じます。
わたし自身、VBAを学習し始めた頃、中々、お目当ての情報に辿り着けず苦労した経験があります。
今回の記事は、可能な限り、初心者にとって分かりやすくシンプルに説明していますので、ぜひご覧ください。
Excelのマクロを使って業務を自動化する際には、基本的に「繰り返し処理をする」業務が対象になるはずです。1回限りの業務というのは現実的に少なく、また、効率性を高めるための自動化の対象にはならないでしょう。
そして、ほとんどの場合、Excelで繰り返し処理をするということは、処理対象のレコード(行)が複数存在することを意味します。
自動化のプログラムを作成するときには、『何行目の処理をするのか』と『その処理を何回(いつまで)行うのか』を明確に定義し、プログラミングする必要があります。
つまり、「Excelの最終行の取得」とは、Excelの業務を自動化するうえで、処理対象のレコードと処理の終わりをパソコンに指示するために必須の動作なのです。
ここは初心者にとって重要な情報なのですが、VBAでは「最終行を取得するための動作」を決められたひとつのコードで書ける訳ではありません。
同じ作業(最終行の取得)を人間が操作する場合をイメージしてみてください。基本的に、下記のような操作を行うはずです。
<人間の操作例>
ここがポイントです。これは、VBAに限ったお話ではありませんが、プログラミングというのは「こうして、こうする」のように動作を細分化して記述するものなのです。単に「最終行を取得する」というのは、人間にとって明確に見えても、実はプログラミングの観点では非常に曖昧な指示なのです。
これを実現するために、「こうして、こうする」と明確な指示を記述することが、プログラミングなのです。
Sub Sample()
Dim LastRow As Long
LastRow = Range(“A1”).End(xlDown).Row
End Sub
Sub Sample()
Dim LastRow As Long
LastRow = Cells(1,1).End(xlDown).Row
End Sub
基本的に、Excelの最終行の取得方法は、前記の通りですが、Excelシートのデータコンディションによっては、処理対象のレコード列の中に、本来、データが存在しているはずのセルが空白になっているかもしれません。
この場合、前記の取得方法では、最終行の判断が適切な結果にはなりません。(下図の場合、A5を最終行と判断します)
それを回避するため、最終行を取得する場合には、Excelシートの最下段セル(Excelバージョンによって行数は異なる)から、上に向かって取得する必要があるのです。
<人間の操作例>
下記は、下からExcelの最終行を取得するためのVBAコードです。なお、最下段セルは上図のように目検で確認しても構いませんが、Rows.Countを使えば、そのExcelの最下段の行数を自動的に取得してくれます。
<最下段セルを指定>
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
<最下段セルを指定>
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コードを書いてみましょう!もちろん、最終行は人間が判定するのではなく、この記事で紹介したコードを使用します。
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
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の学習を始めた頃、「こういう解説のページがあればよかったな」と思えるようなイメージで記事を書きましたが、いかがでしたか?
少し文字数は多くなってしまいましたが、見やすさ、分かりやすさを重視したため、基本的な使い方に限定しましたが、行列を含めた複合的な使用例については、後日、別記事で紹介したいと思います。