Resize は「基準のセル範囲の“縦横サイズ”だけを変えるための道具」
Resize は、ある Range(セル範囲)を「基準」にして、
その位置はそのままに、“高さ(行数)”と“幅(列数)”だけを変更した新しい範囲を作るためのプロパティです。
「A2 から始まる 1 行 1 列の範囲(A2)を、3 行 2 列の範囲(A2:B4)に広げたい」
「このセルを左上とした、下に 10 行 × 右に 5 列の範囲を取りたい」
といった、“基準はここで、サイズだけ変えたい”場面で Resize が活躍します。
Offset が「場所をずらす」のに対して、
Resize は「大きさを変える」と覚えておくと、頭に入りやすいです。
Resize の基本構文と、一番シンプルなイメージ
基本構文
書き方はこうです。
Range(基準).Resize(行数, 列数)
VB行数:その範囲が何行分の高さになるか
列数:その範囲が何列分の幅になるか
どちらも「最終的なサイズ」であって、「増やす数」ではない点が重要です。
A2 を「3 行 × 2 列」の範囲に広げる
Sub SampleResizeBasic()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A2") ' 基準は A2(1行1列)
rng.Resize(3, 2).Interior.Color = vbYellow
End Sub
VBこのコードは、「A2 を左上とした 3 行 × 2 列の範囲(A2:B4)を黄色にする」処理です。
ここでのポイントは、
基準の左上位置(A2)はそのまま
高さを 3 行、幅を 2 列に“変更した範囲”を作る
というイメージです。
Resize の“行数・列数”の感覚をしっかりつかむ
「増やす数」ではなく「最終的なサイズ」
よくある勘違いは、「今 1 行だから、2 行増やしたい → Resize(2, …)」と考えてしまうことです。
Resize の引数は「増分」ではなく「最終的な行数・列数」です。
例えば、基準が 1 行 1 列の範囲(A2)だとして:
rng.Resize(1, 1) ' 1行1列 → A2 だけ
rng.Resize(2, 1) ' 2行1列 → A2:A3
rng.Resize(3, 2) ' 3行2列 → A2:B4
VB「今が何行か」ではなく、「最終的に何行にしたいか」を指定する、という感覚を持ってください。
行数だけ・列数だけ変えたいとき
どちらか片方だけ変えたいときは、もう片方を省略できます。
rng.Resize(5) ' 行数だけ 5 行に、列数はそのまま
rng.Resize(, 3) ' 列数だけ 3 列に、行数はそのまま
VBカンマの前後で「行数」「列数」を表しているので、
片方だけ指定したいときは、もう片方を空けて書きます。
Resize と Offset を組み合わせて「動く表の範囲」を作る
「基準セルから下に N 行 × 右に M 列」の範囲
Resize は「サイズを変える」、Offset は「位置をずらす」。
この2つを組み合わせると、かなり柔軟な範囲指定ができます。
Sub SampleResizeWithOffset()
Dim ws As Worksheet
Dim startCell As Range
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set startCell = ws.Range("B3") ' 左上の基準セル
Set rng = startCell.Resize(4, 3) ' B3 を左上とした 4行×3列 → B3:D6
rng.Value = "★"
End Sub
VBここでは Offset は使っていませんが、
「左上の基準セルを決めて、そこから Resize で範囲を広げる」というパターンです。
さらに、基準位置も動かしたいときは Offset と組み合わせます。
Sub SampleResizeOffsetCombo()
Dim ws As Worksheet
Dim baseCell As Range
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set baseCell = ws.Range("A1")
' A1 から 2行下・1列右 → B3 を左上とし、3行×2列の範囲
Set rng = baseCell.Offset(2, 1).Resize(3, 2)
rng.Interior.Color = vbYellow
End Sub
VB流れとしては、
A1 を基準に Offset(2,1) で B3 に移動
その B3 を左上として Resize(3,2) で B3:C5 の範囲を作る
という感じです。
Resize を使うと「最終行・最終列までの範囲」が自然に書ける
A 列の最終行までを、ヘッダーから一気に範囲にする
「ヘッダーセルは分かっているけど、データがどこまで続くかは毎回違う」
こういうときに Resize がとてもきれいに書けます。
Sub SampleResizeLastRow()
Dim ws As Worksheet
Dim header As Range
Dim lastRow As Long
Dim dataRange As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set header = ws.Range("A1") ' 見出しセル
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row ' A列の最終行
Set dataRange = header.Offset(1, 0).Resize(lastRow - 1, 1)
' A2 を左上とし、「(最終行 - 1) 行 × 1 列」の範囲 → A2:A最終行
dataRange.Interior.Color = vbYellow
End Sub
VBここでのポイントは、
ヘッダー A1 は固定
データ開始は A2(なので Offset(1,0))
行数は「最終行 – 1」(2 行目から最終行までの行数)
というふうに、「位置」と「サイズ」を分けて考えていることです。
Resize を使うと、「何行分か」をきちんと数えて範囲にできるので、
“データの長さが毎回変わる表”に対して、とても相性が良いです。
Resize を使うときに意識してほしい重要ポイント
「左上の位置はそのまま、縦横のサイズだけ変える」というイメージを崩さない
Resize は、あくまで「基準 Range の左上位置はそのまま」です。
動くのは“範囲の大きさ”だけです。
位置を変えたいときは Offset
サイズを変えたいときは Resize
この役割分担をはっきりさせておくと、
「ここは Offset だな」「ここは Resize だな」と自然に選べるようになります。
行数・列数は「最終的なサイズ」であることを忘れない
もう一度だけ強調しますが、Resize の引数は「増やす数」ではありません。
基準が 1 行 1 列の範囲なら、
Resize(3, 2) → 3 行 × 2 列の範囲
Resize(1, 5) → 1 行 × 5 列の範囲
というふうに、「最終的にどういうサイズにしたいか」を指定します。
ここを勘違いすると、「思ったより広がりすぎた」「狭すぎた」というズレが起きやすいので、
頭の中で「左上は固定、縦横のサイズだけ変える」という図をイメージしながら書いてみてください。
まとめ:Resize は「基準範囲の“縦横サイズ”を自在に変えるためのレバー」
Resize の本質は、
「ある Range を基準に、その左上位置はそのままに、行数・列数だけを変えた新しい範囲を作る」
ことです。
押さえておきたいポイントをコンパクトにまとめると、
Resize(行数, 列数) は「最終的な高さ・幅」を指定する(増分ではない)
行数だけなら Resize(行数)、列数だけなら Resize(, 列数) と書ける
Offset が“位置”、Resize が“サイズ”を担当する
ヘッダーセル+最終行・最終列と組み合わせると、「可変長の表全体」をきれいに範囲指定できる

