【VBA】Resizeプロパティの使い道とは?セル範囲を変更するテクニックをご紹介
毎回手作業でセル範囲を選択するのが面倒。。。データ量が変わるたびに範囲指定をやり直すのは時間の無駄。。。
こんな問題を抱えていませんか?
こんな問題はVBAのResizeプロパティを使えば、たった1行のコードでセル範囲を自由自在に変更することができます。
売上データの集計範囲を自動調整したり、レポートのテンプレート作成を効率化したり、業務時間を大幅短縮することが可能。
VBA初心者でも今すぐ実践できる基本的な使い方から、プロも使う高度な応用技術まで、実際のサンプルコードとともにわかりやすく解説します。
この記事を読めば、明日からExcel作業が格段に楽になることをお約束します。
【VBA】Resizeプロパティとは?基本的な概念を理解しよう
VBAのResizeプロパティは、指定したセル範囲のサイズを自由に変更できる便利な機能です。
この機能を使えば、1つのセルから複数のセル範囲に拡張したり、既存の範囲を縮小したりできます。
データ処理やレポート作成において、動的な範囲指定が必要な場面で威力を発揮。
Rangeオブジェクトと連携することで、効率的なワークシート操作が可能になり、マクロの実行速度向上にも繋がります。
VBA初心者でも簡単に習得できる基本的なプロパティでありながら、応用次第で高度な自動化システムを構築できる重要な要素といえるでしょう。
Resizeプロパティの定義と役割
Resizeプロパティは、選択したセルを起点として新しい範囲を作成する機能です。
元の位置を変えずにサイズだけを変更することが可能。
たとえば、A1セルから始まる3行2列の範囲を作りたい場合、Range(“A1").Resize(3, 2)と記述するだけで簡単に実現できます。
Sub ResizeExample()
Dim myRange As Range
Set myRange = Range("A1").Resize(3, 2)
myRange.Select
End Sub
このコードは、
A1セルを基準点として設定し、そこから3行2列の範囲(A1:B3)を作成してmyRange変数に格納する
という内容です。
最後にその範囲を画面上で選択状態にして、視覚的に確認できるようにしています。
データの集計範囲を動的に決める際や、テンプレート作成時の範囲指定で頻繁に使用される基本的なテクニックです。
RangeオブジェクトとResizeプロパティの関係
RangeオブジェクトとResizeプロパティは密接な関係があり、両者を組み合わせることで柔軟なセル操作が実現します。
Rangeオブジェクトは特定のセルや範囲を表すオブジェクトで、Resizeプロパティはそのオブジェクトのサイズを変更するメソッドです。
重要なポイントは、Resizeプロパティを使っても元のRangeオブジェクト自体は変更されず、新しいRangeオブジェクトが返されることです。
Sub RangeResizeRelation()
Dim originalRange As Range
Dim resizedRange As Range
Set originalRange = Range("B2")
Set resizedRange = originalRange.Resize(4, 3)
originalRange.Value = "元の範囲"
resizedRange.Value = "拡張後の範囲"
End Sub
このコードは、
B2セルをoriginalRangeとして設定し、次にそれを4行3列に拡張してresizedRangeを作成。originalRangeに値を入れるとB2セルのみに文字が入り、resizedRangeに値を入れるとB2からD5の全範囲に同じ文字が入る
という処理を確認することができます。
この仕組みを理解することで、データの一括処理や範囲の動的な変更が効率的に行えるようになります。
他のセル範囲変更メソッドとの違い(OffsetやCellsとの比較)
Resizeプロパティは、OffsetプロパティやCellsプロパティと混同されがちですが、それぞれ異なる役割を持っています。
Offsetは範囲の位置を移動させ、Cellsは特定の行列位置のセルを取得しますが、Resizeは範囲のサイズを変更します。
これらの違いを理解して使い分けるようにしましょう。
Sub ComparisonExample()
Dim baseRange As Range
Set baseRange = Range("A1")
' Resize: サイズ変更(A1:C3)
baseRange.Resize(3, 3).Interior.Color = RGB(255, 200, 200)
' Offset: 位置移動(D1)
baseRange.Offset(0, 3).Value = "Offsetで移動"
' Cells: 特定位置取得(E5)
Cells(5, 5).Value = "Cellsで指定"
End Sub
このコードは
3つのメソッドの違いを実際に示しています。ResizeでA1から3×3の範囲を作成して背景色を設定し、次にOffsetでA1から右に3列移動したD1セルに文字を入力、最後にCellsで5行5列目(E5)に直接文字を入力する
という内容です。
Resizeは元の位置を起点にサイズを変更、Offsetは位置をずらす、Cellsは座標で直接指定という違いがはっきりと分かります。
【VBA】Resizeプロパティの基本的な使い方と構文
Resizeプロパティの基本構文は非常にシンプルで、Range.Resize(行数, 列数)という形で記述します。
行数と列数の両方を指定することで、任意のサイズの範囲を作成可能。
省略した場合は元の範囲サイズが維持されるため、片方だけを変更することも可能です。
この柔軟性により、様々な状況に対応できるコードが書けます。
変数と組み合わせることで、より高度な自動化処理を実現できる基本的ながら重要なスキルです。
Resizeプロパティの基本構文とパラメータ
Resizeプロパティの構文は、Range(“セル範囲").Resize(行数, 列数)という形式で記述します。
第一引数が行数、第二引数が列数を表し、両方とも正の整数で指定します。
引数を省略した場合、その方向のサイズは変更されません。
パラメータは変数でも指定できるため、プログラムの実行時にサイズを決定することも可能です。
Sub BasicSyntax()
Dim rowCount As Integer
Dim colCount As Integer
rowCount = 5
colCount = 3
' 基本的な構文
Range("A1").Resize(rowCount, colCount).Select
' 片方だけ指定(列数のみ変更)
Range("E1").Resize(, 4).Select
End Sub
このコードでは、
変数に行数と列数を格納し、それをResizeプロパティの引数として使用。最初の例では5行3列の範囲(A1:C5)を作成し、二番目の例では行数を省略して4列だけの範囲を作成する
という内容です。
VBAは実行時に変数の値を参照するため、rowCountとcolCountの値を変更すれば、異なるサイズの範囲を動的に生成できます。
行数・列数を指定したセル範囲の拡張方法
セル範囲の拡張は、起点となるセルから指定した行数・列数分だけ範囲を広げる処理です。
重要なのは、常に元のセル位置が左上の起点になることです。
たとえば、B3セルから4行5列に拡張すると、B3からF6までの範囲が作成されます。
この規則性を理解することで、予期しない範囲選択を避けることができます。
データの入力や書式設定において、正確な範囲指定は必須のスキルといえるでしょう。
Sub ExpandRange()
Dim startCell As Range
Dim expandedRange As Range
Set startCell = Range("C2")
Set expandedRange = startCell.Resize(6, 4)
' 拡張した範囲に連続番号を入力
Dim i As Integer
For i = 1 To expandedRange.Cells.Count
expandedRange.Cells(i).Value = i
Next i
End Sub
このコードは、
C2セルを起点として6行4列の範囲(C2:F7)を作成し、その範囲内のすべてのセルに連続番号を入力。まずstartCellにC2を設定し、Resizeで拡張してexpandedRangeに格納。次にForループでexpandedRange内の各セルに順番に番号を入力する
という内容です。
expandedRange.Cells.Countで総セル数を取得し、expandedRange.Cells(i)で個々のセルにアクセスしています。
単一セルから複数セル範囲への変更テクニック
単一セルから複数セル範囲への変更は、Resizeプロパティの最も基本的な使い方です。
1つのセルを起点として、必要なサイズの範囲を瞬時に作成できます。
このテクニックは、テンプレートの作成やデータの一括処理において特に有効です。
起点セルの選択方法も重要で、固定位置だけでなく、アクティブセルや検索結果のセルからも範囲を拡張できます。
Sub SingleToMultiple()
' アクティブセルから3×3の範囲を作成
Dim multiRange As Range
Set multiRange = ActiveCell.Resize(3, 3)
' 作成した範囲を色分け
multiRange.Interior.Color = RGB(200, 255, 200)
multiRange.Borders.Weight = xlMedium
' 中央に文字を入力
multiRange.Cells(2, 2).Value = "中央"
multiRange.Cells(2, 2).Font.Bold = True
End Sub
このコードは、
現在アクティブになっているセルを起点として3×3の範囲を作成し、薄い緑色の背景と太い枠線を設定し、中央のセル(2行2列目)に太字で「中央」という文字を入力する
という内容です。
ActiveCellを使用することで、ユーザーがどのセルを選択していても、そこから範囲を拡張できます。
実行前に任意のセルを選択してからマクロを実行すると、その位置から範囲が作成されます。
【VBA】Resizeプロパティの実践的な活用例とサンプルコード
実際の業務では、Resizeプロパティを使ってデータの範囲を自動で調整する場面が多々あります。
売上データの集計範囲を自動決定したり、レポートのテンプレート作成で可変サイズの表を作ったりする際に威力を発揮します。
特に、データの量が日々変化するような状況では、手動での範囲指定では対応しきれません。
Resizeプロパティと他のVBA機能を組み合わせることで、完全自動化された処理システムを構築可能。
ここでは、実際の業務でよく使われる3つの活用パターンをご紹介し、それぞれ実践的なサンプルコードで解説していきます。
動的なデータ範囲の処理(表のサイズ自動取得)
データの範囲を自動で取得する処理は、日常業務で最も頻繁に使用される技術です。
表のサイズが変動する場合、手動で範囲を指定するのは非効率的で間違いも起こりやすくなります。
Resizeプロパティと組み合わせることで、データの最終行・最終列を自動判定し、適切な範囲を動的に処理可能。
この技術をマスターすれば、どんなサイズのデータでも対応できる汎用性の高いマクロが作成できるでしょう。
Sub AutoDataRange()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim dataRange As Range
Set ws = ActiveSheet
' データの最終行・最終列を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' A1から最終行・最終列までの範囲を作成
Set dataRange = ws.Range("A1").Resize(lastRow, lastCol)
' データ範囲を選択して確認
dataRange.Select
MsgBox "データ範囲: " & dataRange.Address
End Sub
このコードは、
ワークシートの最終行と最終列を自動で検出。(A列の最下端からCtrl+↑で上に移動した位置が最終行、1行目の最右端からCtrl+←で左に移動した位置が最終列です。)取得した値を使ってA1セルからResizeプロパティで範囲を作成し、データの全範囲を自動選択。最後にメッセージボックスで範囲のアドレスを表示して確認
する
という内容です。
データ量が変わっても常に正確な範囲を取得できる実用的なコードです。
関連記事「最終行を取得するVBA」では、Count関数の使い方が紹介されています。
見出し行を除いたデータ部分のみの操作
実際のデータ処理では、見出し行を除いてデータ部分のみを対象にしたい場合がよくあります。
Resizeプロパティを使えば、見出し行をスキップした範囲を簡単に取得可能。
この技術は、CSV データの処理やレポート作成で頻繁に使用される重要なテクニックです。
Sub DataOnlyProcess()
Dim ws As Worksheet
Dim headerRange As Range
Dim dataRange As Range
Dim lastRow As Long
Dim lastCol As Long
Set ws = ActiveSheet
' データの範囲を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' 見出し行(1行目)を設定
Set headerRange = ws.Range("A1").Resize(1, lastCol)
' データ部分のみ(2行目以降)を設定
If lastRow > 1 Then
Set dataRange = ws.Range("A2").Resize(lastRow - 1, lastCol)
' データ部分の背景色を変更
dataRange.Interior.Color = RGB(240, 248, 255)
' 見出し行は太字に設定
headerRange.Font.Bold = True
headerRange.Interior.Color = RGB(200, 200, 200)
End If
End Sub
このコードは、
全体のサイズを取得し、1行目を見出し行として設定。データ部分は2行目(A2)から開始し、全体の行数から1を引いた値をResizeの行数パラメータに指定。見出し行には灰色の背景と太字、データ部分には薄い青色の背景を設定して視覚的に区別する
という内容です。
lastRowが1より大きい場合のみデータ範囲を処理することで、見出しのみの表でもエラーが発生しないよう配慮されています。
複数シート間でのデータコピー・移動処理
複数のワークシート間でデータをコピーや移動する処理は、レポート作成や データ整理において欠かせない機能です。
Resizeプロパティを使うことで、コピー元とコピー先の範囲を動的に調整し、データサイズに関係なく正確な処理が可能。
特に、毎日更新されるデータを別シートに集約する場合や、月次レポートを作成する際に威力を発揮し、作業時間の大幅な短縮と入力ミスの防止が実現できます。
Sub CopyBetweenSheets()
Dim sourceSheet As Worksheet
Dim targetSheet As Worksheet
Dim sourceRange As Range
Dim targetRange As Range
Dim lastRow As Long
Dim lastCol As Long
' コピー元とコピー先のシートを設定
Set sourceSheet = Worksheets("元データ")
Set targetSheet = Worksheets("集計シート")
' 元データの範囲を自動取得
With sourceSheet
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set sourceRange = .Range("A1").Resize(lastRow, lastCol)
End With
' コピー先の範囲を設定(A1から開始)
Set targetRange = targetSheet.Range("A1").Resize(lastRow, lastCol)
' データをコピー
sourceRange.Copy targetRange
' コピー完了メッセージ
MsgBox "データのコピーが完了しました。" & vbCrLf & _
"範囲: " & sourceRange.Address & " → " & targetRange.Address
End Sub
このコードは、
2つのシートオブジェクトを取得し、元データシートからデータ範囲のサイズを自動検出。Withステートメントを使用してsourceSheetを参照し、最終行・最終列を取得してからResizeで範囲を作成。コピー先も同じサイズの範囲をA1から作成し、Copyメソッドで一括コピーする
という内容です。
処理完了後はメッセージボックスでコピー元とコピー先のアドレスを表示し、処理結果を確認できるようにしています。
関連記事「別シートに情報を自動反映させるマクロの作り方」では、別シートにテキストを転記する方法が紹介されています。
【VBA】Resizeプロパティ使用時の注意点とエラー対策
Resizeプロパティは便利な機能ですが、使用する際にはいくつかの重要な注意点があります。
- 複数範囲を選択している状態での動作
- マイナス値を指定した場合のエラー
- 実行時エラー1004の発生
これらの問題を事前に把握し、適切なエラーハンドリングを実装することで、安定したマクロに仕上げることができます。
エラーの原因と対処法を熟知することはとても重要です。
ここでは、実際によく発生する問題とその解決策を具体的なコード例とともに詳しく解説していきます。
複数範囲選択時の動作(左上セルが基準となる仕様)
Resizeプロパティを複数のセル範囲に適用した場合、Excel は自動的に左上のセルを基準点として処理します。
この仕様を理解していないと、予期しない範囲が選択されることがあります。
たとえば、A1:C3とE5:G7を選択してResizeを実行すると、左上にあるA1が基準点となり、E5:G7の選択は無視されます。
複数範囲での処理を行う際は、この動作を前提としたコード設計を行いましょう。
Sub MultipleRangeResize()
Dim multiRange As Range
Dim resizedRange As Range
' 複数範囲を選択(A1:B2とD4:E5)
Set multiRange = Range("A1:B2,D4:E5")
' Resizeを適用(左上のA1が基準となる)
Set resizedRange = multiRange.Resize(4, 3)
' 結果確認用の色付け
multiRange.Interior.Color = RGB(255, 200, 200) ' 元の範囲は薄い赤
resizedRange.Interior.Color = RGB(200, 255, 200) ' リサイズ後は薄い緑
MsgBox "元の範囲: " & multiRange.Address & vbCrLf & _
"リサイズ後: " & resizedRange.Address
End Sub
このコードでは、
A1:B2とD4:E5という2つの範囲を含むmultiRangeを作成し、そこにResizeを適用。実行すると、左上のA1セルが基準となって4行3列の範囲(A1:C4)が作成。元の複数範囲には薄い赤色、リサイズ後の範囲には薄い緑色を設定して視覚的に違いを確認する
という内容です。
メッセージボックスでアドレスを表示すると、元は「$A$1:$B$2,$D$4:$E$5」、リサイズ後は「$A$1:$C$4」となり、D4:E5の部分が無視されていることが分かります。
実行時エラー1004の原因と対処法
実行時エラー1004は、Resizeプロパティ使用時に最も頻繁に発生するエラーです。
主な原因は、ワークシートの境界を超える範囲を指定した場合や、無効なパラメータを渡した場合です。
特に、現在のセル位置と指定したサイズの組み合わせが、Excel の最大行数・列数を超えるときに発生します。
適切なエラーハンドリングを実装し、エラー発生を防止しましょう。
Sub ErrorHandling1004()
Dim targetRange As Range
Dim rowSize As Long
Dim colSize As Long
' テスト用に大きなサイズを設定
rowSize = 100000
colSize = 50
On Error GoTo ErrorHandler
' エラーが発生する可能性のある処理
Set targetRange = Range("XFD1048576").Resize(rowSize, colSize)
targetRange.Select
MsgBox "処理が正常に完了しました。"
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 1004
MsgBox "範囲指定エラーが発生しました。" & vbCrLf & _
"指定したサイズがワークシートの範囲を超えています。" & vbCrLf & _
"行数: " & rowSize & ", 列数: " & colSize
Case Else
MsgBox "予期しないエラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description
End Select
' エラー情報をクリア
Err.Clear
End Sub
意図的にExcelの最大範囲を超える設定でエラーを発生させ、適切な エラーハンドリングの実装例を示しています。
XFD1048576は Excel の最右下のセルで、そこから更に範囲を拡張しようとすると1004エラーが発生します。
このコードは、
On Error GoTo文でエラーが発生した場合の処理先を指定し、Select Case文で エラー番号に応じた適切なメッセージを表示。最後にErr.Clearでエラー情報をクリアして、後続の処理に影響を与えないようにする
という内容です。
関連記事「エラー無視の落とし穴」では、Resume Nextを安全に使う実践テクニックが紹介されています。
マイナス値指定時の注意事項とエラー回避方法
Resizeプロパティにマイナス値を指定すると、即座に実行時エラーが発生します。
行数や列数は必ず1以上の正の整数である必要があります。
変数を使用してサイズを動的に決定する場合、計算結果がマイナス値になる可能性を事前にチェックしましょう。
適切な入力値検証を行うことで、エラーの発生を未然に防ぎ、安定したプログラムを作成できます。
Sub ValidateResizeParameters()
Dim rowCount As Long
Dim colCount As Long
Dim baseRange As Range
' テスト用の値(マイナス値を含む)
rowCount = -3
colCount = 5
Set baseRange = Range("A1")
' パラメータの検証
If rowCount <= 0 Or colCount <= 0 Then
MsgBox "エラー: Resizeプロパティの行数・列数は1以上の正の整数で指定してください。" & vbCrLf & _
"現在の設定 - 行数: " & rowCount & ", 列数: " & colCount
Exit Sub
End If
' パラメータが正常な場合の処理
Dim resultRange As Range
Set resultRange = baseRange.Resize(rowCount, colCount)
resultRange.Select
MsgBox "正常に処理されました。" & vbCrLf & _
"範囲: " & resultRange.Address
End Sub
このコードでは、
rowCountに意図的にマイナス値(-3)を設定し、If文で0以下の値がないかチェック。マイナス値や0が検出された場合は、エラーメッセージを表示してプログラムを終了する。パラメータが正常な場合のみResizeプロパティを実行し、成功メッセージを表示する
という内容です。
Resizeプロパティを実行する前に、行数と列数の値を検証するコードにすることで、
実行時エラーを防ぎユーザーにとって分かりやすいエラーメッセージを提供できます。
VBAでエクセル業務の効率化を実現
VBAを活用することで、エクセルでの日常業務を劇的に効率化できます。
VBAを使えば、
繰り返し作業の自動化によって人的ミスを削減し、作業時間を大幅に短縮する
ことが可能です。
毎日行っているデータ集計やレポート作成を自動化すれば、数時間かかっていた作業がボタン一つで数分で完了します。
エクセル作業が多い環境ではVBAの導入は必須事項である!といっても過言ではありません。
マクロを導入するメリット
マクロを導入する最大のメリットは、作業時間の短縮と品質の向上を同時に実現できることです。
人間が時間をかけて行う単純作業をコンピュータが正確かつ高速に処理することができます。
たとえば、手作業で1時間かかっていたデータ整理が、マクロなら数秒で完了し、さらに計算ミスや入力間違いも完全に防げます。
また、一度作成したマクロは何度でも使い回せるため、長期的な業務効率化投資としても非常に価値があります。
結果として、マクロ導入は時間コストの削減と業務品質の向上という二重のメリットをもたらします。
VBA学習の始め方
VBA学習の最も効果的な始め方は、実際の業務課題から出発することです。
目的が明確な学習は記憶定着率が高く、モチベーションも維持しやすいのは間違いありません。
たとえば、毎週行っているデータ集計作業を自動化することを目標に設定し、必要な機能から順番に覚えていけば実践的なスキルがすぐに身につきます。
基本的な変数の使い方から始まり、ループ処理、条件分岐、配列など、段階的にレベルアップしていくことで、確実にVBAをマスターできます。
関連記事「VBA初心者必見!マクロの作り方」では、コードを書く画面の開き方や書いたコードの実行方法が図やサンプルコードを使って紹介されています。
マクロの開発を外注依頼する
業務内容に合わせた効率化マクロを導入したいけど、VBAコードを開発する時間がない。。。どうやってプログラムを組めばいいかわからない。。。
このような方は、マクロ開発を外注に依頼しちゃいましょう。
外注依頼することで本業に集中しながら高品質なマクロを即座に導入することができます。
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
効率化マクロを導入してエクセル業務の効率をアップさせましょう。