和風スパゲティのレシピ

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

セル範囲を行数・列数指定で取得する - Resize

セル範囲を行数・列数指定で取得する、
Resizeプロパティについて解説します。

基本構文

Rangeオブジェクト.Resize(行数, 列数)

サンプルコード

' 行数・列数指定でセル範囲を取得する
Debug.Print Range("A1").Resize(3, 3).Address ' $A$1:$C$3

' 元の大きさは無視される
Debug.Print Range("A10:E20").Resize(3, 3).Address ' $A$1:$C$3

' 行数だけを拡張する
Debug.Print Range("A1").Resize(3).Address ' $A$1:$A$3

' 省略した列数は元の大きさがそのまま使われる
Debug.Print Range("A1:C1").Resize(3).Address ' $A$1:$C$3

' 列数だけを拡張する
Debug.Print Range("A1").Resize(, 3).Address ' $A$1:$C$1

' 省略した列数は元の大きさがそのまま使われる
Debug.Print Range("A1:A3").Resize(, 3).Address ' $A$1:$C$3

' 0やマイナスを渡すと「アプリケーションまたはオブジェクト定義のエラー」
Debug.Print Range("A1:A3").Resize(0, 0).Address ' $A$1:$C$3

解説

Rangeオブジェクト.Resizeプロパティを実行すると、
セル範囲を行数・列数指定で取得することができます。

Range(Cells, Cells)に比べてコードを短く簡潔に書けることも多いです。

Worksheets("○○").Range(Worksheets("○○").Cells(2, 2) _
                                      ,Worksheets("○○").Cells(4, 4))
' ↓書き替え
Worksheets("○○").Cells(2, 2).Resize(3, 3)

範囲の大きさが分かっている場合はこちらのプロパティを使用しましょう。


Resizeプロパティは文字通りサイズを取り直すプロパティなので、
元のセル範囲の大きさは全く無視され1から取得し直されます。

' 実行した親Rangeの大きさに関わらず同じものが取得される
Debug.Print Range("A1").Resize(3, 3).Address ' $A$1:$C$3
Debug.Print Range("A10:E20").Resize(3, 3).Address ' $A$1:$C$3

ただし、行・列いずれかを省略した場合は、
省略した引数は元の大きさがそのまま使われる仕様です。

Resizeプロパティの使用例

Resize(データ数)で表のデータ範囲を取得する

画像の黄色部分のようなデータ範囲を取得してみましょう。

データ範囲の取得

この時、「データ数」を計算しておくことで、
Resizeプロパティを用いてかなりスッキリしたコードを書くことができます。

' データの数を計算しておく
Dim データ数 As Long
データ数 = 最終行 -1+ 1

' 売上列のデータ範囲を取得
Dim 売上列 As Range
Set 売り上げ列 = Range("E4").Resize(データ数)

「一番目のセルからデータの数だけ下へ伸ばした範囲」という書き方が、
直感的にとてもわかりやすいため読みやすいコードになっていますね。


この使い方ができると、Range(Cells, Cells)形式より格段にコードを短くできます。

まずはこの使い方を覚えておいてください。

表データから見出し行を削除する

表データから見出し行を削除する際は、
ResizeプロパティとOffsetプロパティを組み合わせて実行します。

Set 対象データ範囲 = Worksheets("○○").AutoFilter.Range
Set 対象データ範囲 = 対象データ範囲.Offset(1)
Set 対象データ範囲 = 対象データ範囲.Resize(対象データ範囲.Rows.Count - 1)

対象データ範囲を「ひとつ下にずらして、行数をひとつ減らす」という処理ですね。

この処理もよく行いますので覚えておきましょう。


なお、この例を見るとわかる通りResizeプロパティは「サイズの取り直し」のため、
「行数をひとつ減らす」だけでも少し面倒なコードになります。

' NG
Set 対象データ範囲 = 対象データ範囲.Resize(- 1)

' OK
Set 対象データ範囲 = 対象データ範囲.Resize(対象データ範囲.Rows.Count - 1)

NG例のような「元の大きさを基準に広げる・狭める」ことはできませんので、
Rows.CountやColumns.Countを使って計算する必要があります。


この「セル範囲の拡大・縮小」をよく行う方は、
いちいちこのコードを書かなくて済むよう汎用関数にしておくのをおすすめします。

詳しくはこちらの記事をどうぞ。

www.limecode.jp