Excel VBA(Visual Basic for Applications)で、データの入力されている最終行番号を取得するコード「Range("A1").End(xlDown).Row」と、途中に空白セルがある場合のコード「Cells(Rows.Count, 1).End(xlUp).Row」をご紹介しました。
これらのコードを知った方からは
「最後のセルが結合されているときに最終行番号を取得するにはどうしたらいいのでしょうか?」
といったご質問をいただくことがあります。
例えば、下図のようなExcelシートがあったときには、
「Range("A1").End(xlDown).Row」でも「Cells(Rows.Count, 1).End(xlUp).Row」でも、「4」が返されてきます。
A4:A6セルが結合されているためです。
このときに「6」を取得したいと考えた方から、先のようなご質問をいただくことになります。
MergeAreaプロパティを使って最終行番号を取得するサンプルマクロ
MergeAreaプロパティで結合セルを取得できることをご存知の方の場合、以下のようなコードを思いつくこともあるようです。
Dim end_row As Long
With Cells(Rows.Count, "A").End(xlUp)
end_row = .Row + .MergeArea.Rows.Count - 1
End With
MsgBox end_row
End Sub
MergeAreaプロパティを使うと、結合セル範囲を表すRangeオブジェクトが取得できます。
その結合セルの行の数を取得しているのが「MergeArea.Rows.Count」というコードです。
最終行の行番号「.Row」に、結合セルの行数「.MergeArea.Rows.Count」を足し算して、ダブっているセルを「- 1」しているのが
「.Row + .MergeArea.Rows.Count - 1」
というオブジェクト式の意味です。
Excel VBAのことをあまりご存じないプログラマーな方の場合、上記のようなマクロにする可能性がありますが、もっとシンプルなコードで、最終セルが結合セルであっても最終行番号を取得できます。
Offsetプロパティを使って最終行番号を取得するサンプルマクロ
Offsetプロパティを使うと、以下のような簡単なコードで最終行番号を取得できます。
MsgBox Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row - 1
End Sub
A列(1列目)の一番下のセル「Cells(Rows.Count, 1).End(xlUp)」を取得し、Offsetプロパティで1行0列下のセル「.Offset(1, 0)」を取得する、というのが「Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)」の意味です。
Rowプロパティを使ってその行番号「Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row」を取得して、「- 1」すれば最終行番号になります。
この「Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row - 1」というオブジェクト式であれば、最終セルが結合されていても、最終行番号を取得することができます。
Home » Excel VBA Rangeオブジェクト » 結合セル » セル結合されているときに最終行番号をVBAで取得する