UsedRange は「そのシートで“何かに使われている範囲”をひとかたまりで教えてくれる」
まずイメージから。
UsedRange は「そのワークシートの中で、“何かしら使われているセルの最小の長方形”を表す Range」です。
「使われている」というのは、ざっくり言うと、
値や数式が入っている
書式(色・罫線・フォントなど)が設定されている
といったセルたちのことです。
シート全体の中で、
「ここからここまでが“使われているエリア”だよ」
と、ひとかたまりの Range として返してくれるのが UsedRange です。
「このシート、どこまでが実質的な表なの?」
という問いに対して、「ここ!」と教えてくれるイメージです。
一番基本:UsedRange をそのまま触ってみる
UsedRange のアドレスを確認してみる
まずは「UsedRange がどこを指しているのか」を目で確かめてみましょう。
Sub SampleUsedRangeBasic()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.UsedRange
MsgBox "UsedRange は " & rng.Address & " です。"
End Sub
VBこのコードを実行すると、
そのシートの UsedRange が「$A$1:$F$20」のような形で表示されます。
例えば、
A1 にタイトル
A3:F20 に表
それ以外は何もなし
というシートなら、UsedRange はだいたい「$A$1:$F$20」になります。
ここで大事なのは、
UsedRange は「シート全体の中で、“使われているセルを全部含む最小の長方形”」
その長方形を Range として扱える
という感覚です。
UsedRange 全体に色を付けてみる
Sub SampleUsedRangeColor()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.UsedRange.Interior.Color = RGB(230, 230, 255) ' 薄い青
End Sub
VBこのコードは、「そのシートで使われている範囲だけ」を薄い青で塗ります。
シート全体ではなく、「実際に何かがあるエリアだけ」を対象にできるのがポイントです。
UsedRange から「最終行・最終列」を取り出す
UsedRange の行数・列数を知る
UsedRange は Range なので、Rows.Count や Columns.Count が使えます。
Sub SampleUsedRangeSize()
Dim ws As Worksheet
Dim rng As Range
Dim rowCount As Long
Dim colCount As Long
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.UsedRange
rowCount = rng.Rows.Count
colCount = rng.Columns.Count
MsgBox "UsedRange は " & rowCount & " 行 × " & colCount & " 列 です。"
End Sub
VB例えば、UsedRange が A1:F20 なら、
Rows.Count は 20、Columns.Count は 6 になります。
シート全体での「最終行番号」「最終列番号」を求める
UsedRange の左上が A1 とは限りません。
例えば、B2 から始まっていることもあります。
そこで、「シート全体での行番号・列番号」に変換してあげます。
Sub SampleUsedRangeLastRowCol()
Dim ws As Worksheet
Dim rng As Range
Dim lastRow As Long
Dim lastCol As Long
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.UsedRange
lastRow = rng.Row + rng.Rows.Count - 1
lastCol = rng.Column + rng.Columns.Count - 1
MsgBox "最終行は " & lastRow & " 行目、最終列は " & lastCol & " 列目です。"
End Sub
VBここでやっている計算は、
UsedRange の左上の行番号 + 行数 − 1 = 最終行
UsedRange の左上の列番号 + 列数 − 1 = 最終列
というシンプルなものです。
「シート全体の中で、どこまでが“何かに使われているか”」を知りたいときに使えます。
UsedRange の“クセ”をちゃんと知っておく(ここが重要)
「値がなくても、書式が残っていると“使われている”とみなされる」
UsedRange の一番のクセはここです。
セルに値を入れて、あとで消したとしても、
背景色や罫線、フォントなどの書式が残っていると、
そのセルは「使われている」と判定されます。
つまり、
昔データを入れていた行を削除したり、値だけ消したりしても
書式が残っていると、UsedRange はそこまで含んでしまう
ということです。
「見た目上は何もないのに、UsedRange では最終行がやたら大きい」
という現象は、だいたいこのせいです。
UsedRange を“リセット”したいときは、余計な書式を消す
もし、
「このシート、UsedRange が変に広いな…」
と感じたら、
本当に使っていない行・列の書式を ClearFormats などで消してあげると、
UsedRange がスッキリします。
Sub ResetUsedRangeLook()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Set ws = ThisWorkbook.Worksheets("入力")
' 例えば、100 行目以降・Z 列以降は絶対に使わない前提なら
ws.Range("101:" & ws.Rows.Count).ClearFormats
ws.Range("AA:ZZ").ClearFormats
End Sub
VBこれは一例ですが、
「本当に使わないエリアの書式を消す」ことで、
UsedRange の“無駄な広がり”を抑えられます。
UsedRange をどう使うか ― 典型的な使いどころ
シート全体の「実データエリア」を一気に処理したいとき
例えば、「このシートで使われている範囲だけフォントを整えたい」なら、こう書けます。
Sub FormatUsedRange()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
With ws.UsedRange
.Font.Name = "メイリオ"
.Font.Size = 10
End With
End Sub>
VB「どこまでデータがあるか分からないけど、とにかく“使われているところ全部”を対象にしたい」
というときに、UsedRange はとても便利です。
UsedRange と「列基準の最終行取得」を使い分ける
最終行を取る方法として、
UsedRange から計算する
特定の列を基準に Cells(Rows.Count, 列).End(xlUp).Row を使う
という2つのパターンがあります。
ざっくり言うと、
シート全体の「使われているエリア」をざっくり扱いたい → UsedRange
特定の列を基準に、きっちり最終行を取りたい → End(xlUp) パターン
という使い分けがしやすいです。
「この列には必ずデータが入っている」という前提があるなら、
最終行取得(End(xlUp))の方が信頼性が高いことが多いです。
まとめ:UsedRange は「シートの“実際に使っているエリア”をひとつの Range として扱うための入口」
UsedRange の本質は、
「ワークシートの中で、値や書式などが設定されているセルをすべて含む“最小の長方形”を Range として返す」
ことです。
押さえておきたいポイントをコンパクトにまとめると、
UsedRange は「そのシートで使われているエリア全体」をひとかたまりの Range として扱えるws.UsedRange.Address で、どこからどこまでかを確認できる
Rows.Count / Columns.Count と組み合わせて、最終行・最終列も計算できる
書式だけ残っていても「使われている」とみなされるクセがあるので、用途によっては End(xlUp) と使い分ける
