Excel VBA入門 その39:結合セルで最終行を取得する方法

エクセルVBA VBA



VBAで最終行を取得する際に、最終行が結合セルの場合、思い通りに最終行を取得できないということはありませんか?

Excelでセル結合は当たり前に頻繁に行われていることですので、この問題に直面する人は多いはずです。

今回は、結合セルで最終行を取得する方法について説明します。



結合セルで最終行を取得する方法

表の最終行を取得する際に、例えば下のエクセル表のように最終行が結合セルになっていると、上手く最終行を取得できません。

結合されていないセルの場合なら、Cells(Rows.Count, 1).End(xlUp).Row でうまくいきます。

が、このように結合セルになっていると、実行結果は、「7」という結果になってしまいます。

取得したい数値は「10」です。

結論から言うと、Offsetプロパティを使用します。

Offsetプロパティを使う

Offsetプロパティは、指定したセルを基準に、相対的に上下左右に移動した場所にあるセルを参照します。

細かい説明よりも、まずはOffsetを使って行番号「10」を取得することができるサンプルコードをご覧ください。

Sub 最終行()
    Dim end_row As Long
    end_row = Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row - 1
    MsgBox end_row
End Sub

実行すると、メッセージボックスで「10」と表示されます。もちろん、最終行が結合セルじゃない場合でも取得できます。

結合セルで最終行を取得するサンプルコードの解説

最終行を取得するコードを抜粋すると、以下のコードになります。

Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row – 1

まず、Offsetプロパティの動作は、

  • 指定したセルを基準に、上下左右のセルを取得することができる
  • 結合セルを一つのセルとしてカウントする

となっていて、この性質を利用します。

最終行取得の動きは以下の順になります。

  1. 「Cells(Rows.Count, 1).End(xlUp)」 で最終セルを取得します。
  2. さらに「 .Offset(1, 0) 」で、最終セルの一つ下のセル「A11」に移動します
  3. 「A11」の一つ上のセルを取得したいので、 「 .Row – 1 」で「A11」の行から1を引いた行番号を取得します。

【まとめ】結合セルで最終行を取得する方法

最終行が結合セルになっている表の最終行を取得する方法は、Offsetプロパティを使って、

Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row – 1

と記述すれば最終行を取得することができます。

最終行取得はExcelやVBAで必須マクロなので、ぜひこの機会にマスターしてくださいね。

コメント

タイトルとURLをコピーしました