Excelで作業をしていると、作業していた範囲の最終行の次に新たにデータを追加したくなったり、反対にデータを削除したくなったりすることはよくあるかと思います。
ですが、扱っているデータの量が多ければ多いほど手動で最終行の位置を探し出すのは困難になりますよね。データの増減はよくあることなので、その度に最終行を探したり、関数やマクロを修正したりするのも非効率的です。
そこで今回は、VBAを使用して最終行を自動で取得する方法について解説していきたいと思います!
Excelで最終行を選択する
キー操作で最終行を取得する
まずは、ショートカットキーを使用する方法について確認しましょう。
表内のいずれかにカーソルを置いた後、「Ctrl + ↓」 と打つことで、最終行まで自動で飛んでくれます。
Ctrlキーと矢印キー(↑↓←→)を組み合わせることで、最終行のみに限らずシート内の上下左右の始点、終端に移動することができます。
VBAで最終行を取得する
VBAで最終行を取得する場合は、RangeオブジェクトのEndプロパティを使用します。
【基本構文】
Range(範囲).End(移動方向)
もしくは
Cells(範囲)・End(移動方向)
次のサンプルコードで具体例を見てみましょう。
【サンプルコード】
Sub sampleEnd()
Dim lastRow As Integer
lastRow = Cells(2, 2).End(xlDown).Row
MsgBox "最終行:" & lastRow & "行目"
End Sub
【実行結果】
Endプロパティで「xlDown」を指定することで、下方向に移動します。「.Row」で行数を取得することが可能です。
その他にも、「.Select」でカーソルをセルに合わせたり、「.Value」でセルの値を取得したりもできます。
空白セルが途中にあって最終行が取得できない場合の対処法は?
最終行の取得方法について説明をしてきましたが、上記の方法にはあるデメリットがあります。
途中に空白セルがある場合、この2つの方法だと空白セルの手前で止まってしまうのです。
次は、この場合の対処法について解説をしていきます。
.End(xlUp)を使って下から上へ検索する
これまでの方法では、下方向への移動を使って最終行を取得していましたが、今回は下から上へと移動します。
実際のコードを見てみましょう。
【サンプルコード】
Sub sampleEnd2()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
MsgBox "最終行:" & lastRow & "行目"
End Sub
【実行結果】
まず、「Rows.Count」でシート全体の最大行数を取得してから、その数値を開始位置として指定します。
次に、「End(xlUp)」で上方向への移動を指定します。これで、Excelシートの一番下に飛んでから、Ctrl+↑キーで上へ移動するのと同じ形になります。
下から上へと移動することによって、止まる位置が1番最初に当たった入力済みのセルの位置(つまり最終行)になるので、空白に関係なく取得できるようになります。
使用されているセルの範囲からVBAで最終行を取得する
上で解説した方法の他に、使われたセル範囲から最終行を取得する方法があります。
いくつかやり方がありますので、それぞれ説明していきます。
SpecialCellsメソッドを使用する
1つ目は、SpecialCellsメソッドを使用する方法です。
このメソッドは、指定した条件に一致するセル範囲を返してくれるメソッドで、条件に「xlCellTypeLastCell」と指定することで最終行を取得することができます。
サンプルコードで確認してみましょう。
【サンプルコード】
Sub sampleEnd3()
Dim lastRow As Long
lastRow = Range("A1").SpecialCells(xlCellTypeLastCell).Row
MsgBox "最終行:" & lastRow & "行目"
End Sub
【実行結果】
UsedRangeプロパティを使用する
2つ目は、UsedRangeプロパティを使って取得する方法です。
このプロパティでは、指定したワークシートで使用しているセルの範囲を取得することができます。
サンプルコードで確認してみましょう。
【サンプルコード】
Sub sampleEnd4()
With ActiveSheet.UsedRange
MsgBox "最終行:" & .Rows(.Rows.Count).Row & "行目"
End With
End Sub
【実行結果】
行の取得には、「Rows」を使います。
「指定シート.UsedRange.Rows.Count」で、使用中のセル範囲内の行数が取得できるので、これを引数に指定することで最終行が選択できます。
ただし、UsedRangeを使って取得する場合、罫線を引いたり高さを変えたりなど、セルに変更を加えただけでも使用していると認識されてしまうので、注意が必要です。
CurrentRegionを使用する
3つ目は、CurrentRegionプロパティを使って取得する方法です。
プロパティの引数にCurrentRegion.Countを指定することで、最終行を取得することができます。
サンプルコードで確認していきましょう。
【サンプルコード】
Sub sampleEnd5()
Dim lastRow As Long
lastRow = Range("B4").CurrentRegion(Range("B4").CurrentRegion.Count).Row
MsgBox "最終行:" & lastRow & "行目"
End Sub
【実行結果】
この方法を使う場合、気を付けるべき点が1つあります。
CurrentRegionは、空白のセルで囲まれた範囲を参照するプロパティです。そのため、以下の画像のように空白があると上手く最終行を読み取ることができなくなるので、注意しましょう。
VBAで最終行のさらに下にデータを追加したい場合はどうする?
最終行の取得を行いたいケースは様々かと思いますが、今回は取得した情報をもとに値を新たに追加する場合の例を見ていきましょう。
【サンプルコード】
Sub sampleAdd()
Dim lastRow As Long
lastRow = Cells(Rows.count, 2).End(xlUp).row
Cells(lastRow + 1, 2).Value = "商品I"
End Sub
【実行結果】
最終行を取得した後、そのCellsの値に+1して下の行に値を追加しています。
これを応用することで、他にも色々な場面で取得した情報を活用することができます。
まとめ
VBAで最終行を取得する方法を知っておくと、作業の効率も格段に捗ると思います。
この機会に、ぜひマスターしてみてくださいね!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
- 【VBA入門】配列まとめ(宣言・初期化、反復処理、コピー、結合)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。