こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
「またExcelが言うことを聞いてくれない…」「マクロを組んだのに、データの行数が増えたらエラーが出た」なんて経験はありませんか?
私も新人の頃、データが増えるたびにコード内の「A1:C100」という数字を「A1:C101」に書き換えるという、虚無感たっぷりの作業をしていました。
今日はそんなときに役立つ、VBAの「Resize(リサイズ)」というプロパティについてお話しします。
これを知れば、データの量が明日1,000件になろうが10,000件になろうが、コードを一切書き直さなくて済みます。
それではいきましょう!
Resizeってなに?
一言でいうと、「基準のセルから、指定したサイズに選択範囲を広げる(または縮める)」機能です。
例えば、マウスで「A1」セルをクリックしたまま、右下にグイッと引っ張って範囲選択する動作ありますよね? あれをVBAでやるのがResizeです。
構文は以下の通りです。
Rangeオブジェクト.Resize(行サイズ, 列サイズ)
なぜResizeが必要なの?
「A1からC10まで」と決め打ちで指定してしまうと、データが11行目に追加されたときに無視されてしまいます。
Resizeを使えば、「A1を起点にデータがある分だけ範囲を広げる」という柔軟な指示が出せるようになります。
【コピペOK】実務で使えるコード
では、実際の現場(営業事務など)でよく使うパターンを2つ紹介します。VBE(コードを書く画面)に貼り付けて試してみてください。
パターン1:見出し行(1行目)だけを除いてデータ範囲を取得したい
「タイトルはいらないから、中身だけコピーしたい」ってこと、よくありますよね。
Sub GetDataOnly()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1") ' ※シート名は適宜変えてください
' A1セルを基準にする
With ws.Range("A1")
' Resize(行数, 列数)
' ここでは「10行、3列」にリサイズしています
.Resize(10, 3).Select
End With
End Sub
これだとまだ「10行」と固定されています。これを「データがある分だけ」にするのが次のステップです。
パターン2:データ量に合わせて自動で範囲を変える(最強版)
これが書ければ、あなたはもう初心者卒業です。
Sub SelectDynamicRange()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
' A列の最終行を取得(これがデータの件数になります)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' データがない場合は終了(エラー回避)
If lastRow < 2 Then Exit Sub
' A2セル(見出しの下)を起点に、
' 「最終行 - 1(見出し分)」の行数、
' 「3列」分の幅にリサイズして選択
ws.Range("A2").Resize(lastRow - 1, 3).Select
' ※Selectの代わりに .Copy すればコピーできます
' ws.Range("A2").Resize(lastRow - 1, 3).Copy
MsgBox "範囲を選択しました! 行数: " & (lastRow - 1)
End Sub
データ範囲の自動選択ができると、社内システムからダウンロードしたCSVファイルの内容をコピーさせて、新規のExcelファイルを作成しペースト、集計など何か処理をする…といった一連の流れをマクロで自動化することができるようになります。
ポイント:引数は省略もできる
実は、Resizeの引数は省略できます。
- .Resize(5) → 行だけ5行に変更(列幅はそのまま)
- .Resize(, 3) → 列だけ3列に変更(行数はそのまま)
これを知っていると、コードがさらにスッキリします。
さいごに
今日はResizeについてご紹介しました。
これで、明日からデータの増減に煩わされる必要はありません。
「データ増えたの? ああ、私のコードなら勝手に対応しますよ」と心の中でドヤ顔を決めてください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。


コメント