【VBAリファレンス|実務向け】これだけはおさえるセル操作(2)-Resizeで自由自在|Excel VBA

スポンサーリンク

導入:なぜResizeが必要なのか?

VBAで自動化を行う際、私たちはよく「データ範囲の取得」を行います。しかし、取得した範囲が常に「処理したい範囲」と一致するとは限りません。例えば、「データ全体を取得したけれど、集計用の列だけ除外したい」「見出し行を除いたデータだけをコピーしたい」といったケースです。このような「基準となるセル位置はそのままで、範囲の大きさだけを変えたい」という課題を、もっともスマートに解決するのがResizeプロパティです。

基礎知識:Resizeプロパティの仕組み

Resizeプロパティは、起点となるセル(または範囲)を基準にして、その範囲を「行方向」と「列方向」に拡大・縮小させる機能です。

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

重要なポイントは、Offsetプロパティが「移動(差分)」を扱うのに対し、Resizeは「結果のサイズ(行数・列数そのもの)」を指定する点です。引数を省略すると、元の範囲のサイズをそのまま維持します。

実装・解決策:現場で使えるテクニック

現場でよく遭遇する「項目行(1行目)を除いてデータを扱う」という処理は、OffsetとResizeの組み合わせが鉄板です。
1. まず、CurrentRegionでデータ全体を囲む。
2. Offset(1, 0) で範囲を1行下にずらす。
3. Resizeで元の行数から「1」を引いて、範囲を調整する。
この手順を踏むことで、見出し行を誤ってコピーしてしまうミスを確実に防ぐことができます。

サンプルプログラム:範囲操作の自動化

以下のコードは、アクティブシートのデータ範囲から見出しを除き、別のシートへコピーする実用例です。

Sub Resizeの活用例()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim targetRange As Range

Set wsSource = ActiveSheet
Set wsDest = Sheets(“Sheet2”)

‘ A1セルから連続するデータ範囲を取得
Set targetRange = wsSource.Range(“A1”).CurrentRegion

‘ 見出し行を除いたデータ部分のみをコピーする
‘ 行数を1つ減らし、1行下にオフセットすることで見出しを除外
With targetRange
.Offset(1, 0).Resize(.Rows.Count – 1, .Columns.Count).Copy _
Destination:=wsDest.Range(“A2”)
End With

MsgBox “見出しを除いてコピーしました!”
End Sub

応用・注意点:コードを読みやすくするために

Resizeを使用する際、計算式が複雑になるとコードの可読性が一気に低下します。「Resize(.Rows.Count – 1, .Columns.Count – 1)」のように引数の中に計算を詰め込みすぎると、後から修正するのが困難になります。

現場で役立つコツ:
・変数に格納する:行数や列数を「cntRow」「cntCol」といった変数に一度格納してからResizeを実行すると、デバッグ時に値を確認しやすくなります。
・Withステートメントの活用:対象のオブジェクトが明確な場合はWithを使うことで、コードがすっきりし、記述ミスも減らせます。
・エラー回避:行数をマイナスする際は、データが1行しかない場合に「0」になってエラーになる可能性があります。「If .Rows.Count > 1 Then」のような条件分岐を入れるのがプロの現場での安全策です。

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