Excel VBAでセル範囲を操作する際に便利なのが「Resize」です。
「特定の範囲を拡張したい」といった場面で役立ちます。
この記事では「Resize」の基本的な使い方から、実用的な活用例を
サンプルコードと図を用いてわかりやすく解説いたします。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
VBA(Excelマクロ)のResizeとは?
「Resize」は、指定したセル範囲の大きさ(行数・列数)を変更することができる機能です。
下図のように元々のセル範囲を基準にして、拡張したり縮小したりすることができます。

では、「Resize」の使い方・書き方を見ていきましょう。
Resizeの使い方
基本構文は以下のとおりです。
' ▼基本構文
Resize(上下方向の範囲, 左右方向の範囲)
' ▼使用例
Resize(2, 3)
第一引数に「上下方向の範囲」を、第二引数に「左右方向の範囲」を指定します。
【引数とは?】
引数は「引き渡す数(引き渡す値)」のことで、Resizeの()内に渡す値を指します。
引数として「変更後の範囲数」を渡すと、「変更された範囲のセル」を私たちが受け取ります。
この受け取る値を「返り値(戻り値)」といいます。
例えば、魚屋さんにアジの3枚おろしを作ってもらいたい場合は、アジを渡して3枚おろしを受け取ります。
アジが引数、3枚おろしが返り値といったところでしょうか。
まずは簡単な使い方で基礎を学びましょう。
簡単な使い方
前提知識{マクロの基礎・作成から実行まで}
前提知識{セルへ値を書き込み}
よりわかりやすくするために、「Resize」を使わない例を先にお見せします。
下記のVBAコードを見てください。
Sub リサイズなし()
Range("B2").Value = "Utatane"
End Sub
B2セルに「Utatane」と書き込みした例です。

指定通り書き込みされました。
では次に、「Resize」で範囲を変更した例です。
Sub リサイズあり()
Range("B2").Resize(3, 2).Value = "Utatane"
End Sub
さきほどと比べて、2行目に「.Resize(3, 2)」が追加されています。
元々のセル指定は「B2だけ」でしたが、この「Resize」が追加されたことにより、下に3つ、右に2つの計6マス分に広がります。

なので、B2~C4セルに「Utatane」が書き込みされます。

範囲指定されたセルから範囲を拡大することもできます。
下記VBAコードはB2:C3(4マス)から範囲を拡大した例です。
Sub リサイズ範囲拡大()
Range("B2:C3").Resize(3, 2).Value = "Utatane"
End Sub
B2を基準として、下に3・右に2の6マス(B2:C4)に範囲が広がります。

注意したいのは、「Resize」で指定した範囲が最終の範囲となります。
(今回の場合は3×2マス分が最終範囲)
「Resize」分の範囲が追加されると思ってしまいがちですが違います。
5×4マス(元々の指定範囲+Resize)ではありませんので注意が必要です。
指定された範囲を縮小することも可能です。
Sub リサイズ範囲縮小()
Range("B2:C3").Resize(1, 1).Value = "Utatane"
End Sub

拡大した場合と同じく、「Resize」で指定した範囲が最終の範囲となります。
今回の場合は(1, 1)を指定しているので、B2セル1マスが指定範囲となるので気をつけてください。
範囲に「0」やマイナスを指定することはできません。
下図のとおりエラーが発生します。
Sub リサイズエラーゼロ()
Range("B2:C3").Resize(0, 0).Value = "Utatane"
End Sub
Sub リサイズエラーマイナス()
Range("B2:C3").Resize(-1, -1).Value = "Utatane"
End Sub

少し高度な使い方
変数を経由して範囲を変更
前提知識{変数の宣言や使い方}
範囲を変更する数値ですが、変数を経由して指定することも可能です。
下記のVBAコードを見てください。
Sub 変数を経由()
Dim row As Integer
Dim col As Integer
row = 3
col = 2
Range("B2").Resize(row, col).Value = "Utatane"
End Sub
変数「row」「col」にそれぞれ数値を代入し、その変数をResizeに適用しています。
結果は直接指定した時と同じで、3×2マスに範囲が拡大されます。
引数を省略
Resizeは、引数である「左右方向の範囲」か「上下方向の範囲」のどちらかを省略することができます。
Range("B2:C3").Resize(3).Value = "Utatane" ' 左右方向の範囲を省略(結果:3×2マス)
Range("B2:C3").Resize(, 4).Value = "Utatane" ' 上下方向の範囲を省略(結果:2×4マス)
引数を省略した場合は、元の指定がそのまま反映されます。
実践的な活用例
前提知識:Excelの最終行を取得
下記VBAコードは、Excelの最終行に合わせて範囲をリサイズし、B列に「OK」と書き込みした例です。
Sub 最終行に合わせてリサイズ()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("B2").Resize(lastRow - 1).Value = "OK"
End Sub
B2を基準に、最終行までの範囲をリサイズし、OKを書き込みしています。

OffsetとResizeの違い
よく似たものに「Offset」があります。
Offsetは、セルの参照位置を変更するもので、Resizeとは違います。
Offset:セルの参照位置を移動(A1→C3など)
Resize:セルの参照範囲を変更(A1:B2→A1:C3など)
関連記事{Offsetの使い方と活用例}
OffsetとResizeを連携することで、「ずらした範囲を拡大して参照する」ということも可能です。
下記のVBAコードを見てください。
Sub オフセットとリサイズ()
Range("A1").Offset(1, 2).Resize(3, 4).Value = "連携"
End Sub
これで、A1セルから(下へ1、右へ2で)C2セルに移動し、C2~F4(3×4)の範囲に「連携」と書き込みされます。

うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
今回の場合は、Resizeの範囲に0やマイナスを指定した場合もエラーとなります。
変数で範囲を指定している場合は、変数の中身を確認してみましょう。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBA(Excelマクロ)の「Resize」について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!