和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セル範囲の最終(右下)セルを取得する

セル範囲の最後のセルを取得する方法を解説します。

セル範囲.Cells(セル範囲.Cells.Count) による取得

例えばRange("B2:D10")からD10セルを取得するには、
以下のコードを実行します。

Dim セル範囲  As Range
Set セル範囲 = Range("B2:D10")

Dim 最終セル As Range
Set 最終セル = セル範囲.Cells(セル範囲.Cells.Count)

 
セル範囲の最終(右下)セルを取得するには、
セル範囲.Cells(セル範囲.Cells.Count)というコードを用います。


最終シートを取得するWorksheets(Worksheets.Count)などと同様、
コレクションの要素数番目の要素 = コレクションの最終要素
であることを利用したコードですね。

一応、

Set 最終セル = Range("B2:D10").Cells(Range("B2:D10").Cells.Count)

こう書くこともできますが、読みづらいし書き換え忘れのバグも招くので、
同じ記述が2度出てくる場合はしっかり変数にするのをお勧めします。

セル範囲.Cells(i)の挙動と注意点

今回は最終セルのため意識する必要はありませんが、
セル範囲.Cells(i)は以下のような動きで範囲内のセルを走査します。

Dim セル As Range
Dim i As Long
For i = 1 To 12
    
    Range("B2:D4").Cells(i) = i
    
Next

実行結果
Cells(i)の実行順序

実行結果を見てわかる通り、

  • まずは→方向に向かって取得
  • 端に着いたら↓に1つ進んで再度→方向へ
  • 最大セル数を超えても同じ折り返しパターンで↓へ進んでいく

という挙動で取得ができます。


どう進もうとも最後は右下セルになるでしょうから今回は意識しなくていいですが、
一応この挙動で動くことは頭に入れておいてください。

複数エリアを持つセル範囲に注意

上記のコードは複数エリアを持つセル範囲では正しく動きません。

Dim セル As Range
Dim i As Long
For i = 1 To 12
    
    Range("B2:D4,E6:G8").Cells(i) = i
    
Next

実行結果
複数エリア.Cells(i)の挙動

上記の通り、セル範囲.Cells(i)はそのセル範囲の第1エリアだけを対象に動きます。

しかしCells.Countは全エリアのセルをカウントしてしまいますので、

Dim セル範囲  As Range
Set セル範囲 = Range("B2:D4,E6:G8")

セル範囲.Cells(セル範囲.Cells.Count) ' ← D7というセル範囲内ですらない場所を取得

このように全く意味のないセルを取得してしまいます。
(第1エリアの最終セルすら取得できていない)

VBAでRangeオブジェクトを扱う場合は、
取得したRangeが複数エリアになっていないかを注意しておきましょう。