【ExcelVBA・マクロ】Resizeプロパティの使い方|セル範囲のサイズを自由に変更する方法【コピペOK】

ExcelVBA

ExcelVBAでセル範囲を操作していると、「取得したRangeを基準に、もう少し広い範囲や狭い範囲を扱いたい」という場面によく出会います。そんなときに便利なのがResizeプロパティです。

この記事では、Resizeプロパティの基本的な使い方から、Offsetプロパティとの組み合わせ、表の見出し行を除いた範囲の取得といった実践的な活用方法までを解説します。

スポンサーリンク
スポンサーリンク

Resizeプロパティとは

Resizeプロパティは、基準となるセル範囲(Range)を起点に、行数・列数を指定して範囲のサイズを変更するプロパティです。書き方は以下の通りです。

Range.Resize(RowSize, ColumnSize)
  • RowSize:変更後の行数
  • ColumnSize:変更後の列数

いずれも省略可能で、省略した場合は元の範囲の行数・列数がそのまま使われます。基準セルの位置(左上端)は変わらず、そこからサイズだけを変更するイメージです。

基本の使い方

まずは、A1セルを基準に3行2列の範囲へ拡張する例を見てみましょう。

Sub BasicResize()

    Dim rng As Range
    Set rng = Range("A1").Resize(3, 2)

    rng.Value = 100
    MsgBox rng.Address & "に値を入力しました"

End Sub

Range("A1")は本来1セルだけを指しますが、.Resize(3, 2)によって「A1を左上端とする3行2列」、つまりA1:B3の範囲に変換されます。実行するとA1:B3のすべてのセルに100が入力されます。

既存の範囲を拡大・縮小する

Resizeは新規に範囲を作るだけでなく、既にあるRangeオブジェクトのサイズを変えるためにもよく使われます。

Sub ExpandRange()

    Dim rng As Range
    Set rng = Range("A1:B2")

    ' 現在の範囲より1行多く、1列多く拡張する
    Dim expanded As Range
    Set expanded = rng.Resize(rng.Rows.Count + 1, rng.Columns.Count + 1)

    expanded.Select
    MsgBox "拡張後の範囲:" & expanded.Address

End Sub

rng.Rows.Countrng.Columns.Countで現在の行数・列数を取得し、そこに1を足すことで元の範囲より1行1列大きい範囲を求めています。逆に数値を減らせば範囲を縮小することもできます。

Offsetプロパティとの組み合わせ

Resizeは、位置を移動させるOffsetプロパティと組み合わせることで、さらに柔軟な範囲指定ができます。以下は、表の見出し行(1行目)を除いたデータ範囲だけを取得する例です。

Sub GetDataRangeWithoutHeader()

    Dim ws As Worksheet
    Dim tbl As Range
    Dim lastRow As Long
    Dim lastCol As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ' 見出し行(1行目)を除いたデータ範囲を取得
    Set tbl = ws.Range("A1").Resize(lastRow, lastCol).Offset(1, 0).Resize(lastRow - 1, lastCol)

    tbl.Interior.Color = RGB(255, 255, 200)
    MsgBox "データ範囲:" & tbl.Address

End Sub

Offset(1, 0)で1行下にずらし、Resize(lastRow - 1, lastCol)で見出し分を引いた行数に調整しています。見出し行を除外してデータ部分だけに書式を設定したり、値を処理したりする場合に便利なパターンです。

セルを起点に表全体の範囲を取得する

表の先頭セルだけが分かっている状態から、Resizeを使って表全体の範囲を組み立てることもできます。

Sub GetTableRangeFromTopLeft()

    Dim topLeft As Range
    Dim tableRange As Range
    Dim rowCount As Long
    Dim colCount As Long

    Set topLeft = ThisWorkbook.Worksheets("Sheet1").Range("A1")

    rowCount = topLeft.CurrentRegion.Rows.Count
    colCount = topLeft.CurrentRegion.Columns.Count

    Set tableRange = topLeft.Resize(rowCount, colCount)

    tableRange.Borders.LineStyle = xlContinuous
    MsgBox "表全体の範囲:" & tableRange.Address

End Sub

CurrentRegionで表全体の行数・列数を調べたうえで、Resizeを使って改めて範囲を組み立てています。CurrentRegionだけでも表全体を取得できますが、Resizeと組み合わせることで「行数だけ増やす」「列数だけ絞る」といった細かい調整がしやすくなります。

ループ処理と組み合わせて1行ずつ処理する

Resizeは、1行分の範囲を切り出しながらループ処理する際にもよく使われます。

Sub ProcessRowByRow()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim rowRange As Range

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        Set rowRange = ws.Cells(i, "A").Resize(1, 3)  ' A~C列の1行分

        If Application.WorksheetFunction.Sum(rowRange) > 100 Then
            rowRange.Interior.Color = RGB(255, 200, 200)
        End If
    Next i

End Sub

Cells(i, "A").Resize(1, 3)で「i行目のA〜C列」という3列分の範囲を取得しています。1行ずつ範囲を切り出しながら条件判定を行いたいときに、シンプルに書ける方法です。

注意点

Resizeプロパティを使う際は、以下の点に気を付けてください。

  • 基準セルは変わらない:Resizeは範囲の左上端(基準セル)を起点にサイズを変えるだけです。範囲そのものを移動させたい場合はOffsetを使います。
  • 0以下の値は指定できない:RowSizeやColumnSizeに0以下の数値を指定するとエラーになります。ループ処理などで計算結果を渡す場合は、範囲外にならないか事前にチェックしましょう。
  • 元の範囲を上書きするSet rng = rng.Resize(...)のように書くと、元の変数の指す範囲自体が置き換わります。元の範囲を残しておきたい場合は、別の変数に代入してください。

まとめ

Resizeプロパティを使うと、基準となるセル範囲から行数・列数を指定するだけで柔軟に範囲を組み立てられます。

  • Range.Resize(行数, 列数)で範囲のサイズを変更する
  • 省略した引数は元の行数・列数がそのまま使われる
  • Offsetと組み合わせることで、見出し行を除いた範囲取得など実践的な処理がしやすくなる
  • ループ処理の中で1行・1列単位の範囲を切り出す用途にも便利

表操作や範囲指定を伴うマクロを書く際は、Resizeプロパティをぜひ活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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