Home » ExcelVBA Rangeオブジェクト » 結合セル » セル結合されているときに最終行番号をVBAで取得する

セル結合されているときに最終行番号をVBAで取得する

対象:Excel2007, Excel2010, Excel2013

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プロパティで結合セルを取得できることをご存知の方の場合、以下のようなコードを思いつくこともあるようです。

Sub 最終行番号を取得する_1()
 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プロパティを使うと、以下のような簡単なコードで最終行番号を取得できます。

Sub 最終行番号を取得する_2()
 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 » ExcelVBA Rangeオブジェクト » 結合セル » セル結合されているときに最終行番号をVBAで取得する

「結合セル」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.