「セルの範囲を選択する方法が分からない」
「UsedRangeって聞いたことはあるけど、使い方が分からない」
Excel VBAのコードを書く際に上記のように思われる方も多いのではないでしょうか。セル範囲の選択にはUsedRangeプロパティが役に立ちます。
本記事では、UsedRangeの使い方からメリットやデメリット、その代替手段まで詳しく紹介しています。
UsedRangeの正しい使い方を身につけるとVBAのコードをスマートに書けるようになるので、ぜひ参考にしてみてください。
【この記事の要約】
- UsedRangeプロパティはシート上の使用済みセル範囲を特定できる
- コードがシンプルになるが、意図しない範囲が選択される可能性もある
- 代替手段としてCurrentRegionやEndプロパティがある
AIコンサルタントの放課後研究室(ホーケン)
メンバー絶賛募集中
- 月に15日間、複数の講師によるビデオチャットを開講(参加回数無制限)
- メンバー限定の案件共有(週2回以上)
- AIコンサルタントやベテランワーカーによるグループセミナー(月2回程度開催)
- AIコンサルタント・フリーランスに役立つノウハウを発信
- 〜月額4,400円(税込)と幅広いAIフリーランスが参加しやすい金額帯
- もちろん無料会員様も大歓迎
*無料会員様にはビデオチャット、案件共有などが付帯しません
無料・有料問わず魅力的なサービスを揃えています。ぜひ、以下で詳細を確認してみてください。
VBAで用いるUsedRangeとは?

UsedRangeとは、ExcelのVBAでワークシート内のデータが存在するセル範囲を指すプロパティです。
UsedRangeはシート上で一度でも値が入力された最も左上のセルから最も右下のセルまでの範囲を自動的に識別します。
ActiveSheet.UsedRange.Select
UsedRangeを使ったセル範囲に対してSelectプロパティを使うと、アクティブシート内の使用済みのセル範囲の選択が行えます。
UsedRangeプロパティの使い方

UsedRangeはシート内のセル範囲を選択できることを利用して、主に以下の用途で使用されるケースが多いようです。
- 使用済みのセル範囲を取得する
- 開始行や最終行を取得する
- 開始列や最終列を取得する
- 別のワークシートにコピー&ペーストする
- 書式設定を一括で適用する
一つずつサンプルコードを紹介しながら解説していきます。
使用済みのセル範囲を取得する
Selectプロパティで使用済みのセル範囲を選択するだけでは、実際にその範囲を取得できているかどうかは確認できません。
そのため、選択された範囲を取得する場合は以下のようにAddressプロパティを使用します。
ActiveSheet.UsedRange.Address
Addressプロパティはアクティブシート内で選択されたセル範囲をテキストとして簡単に取得できます!
開始行や最終行の番号を取得する
UsedRangeで開始行や最終行の行番号を取得する際は以下のようなコードになります。
開始行の取得:
ActiveSheet.UsedRange.Rows(1).Row
最終行の取得:
ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
Rowsプロパティの引数は上記の他にも任意の数字が設定可能です。つまり、使用済みセル範囲の中の任意行の情報が取得できます。
開始列や最終列の番号を取得する

行だけでなく列の情報も取得可能です。開始列や最終列の列番号を取得する際は以下のようなコードになります。
開始列の取得:
ActiveSheet.UsedRange.Columns(1).Column
最終列の取得:
ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Columns.Count).Column
行の取得にはRowsプロパティを使いますが、列の場合はColumnsプロパティで情報を取得できます。
別のワークシートにコピー&ペーストをする
選択したセル範囲に対して、同じExcelブックの別のシートへコピー&ペーストをするコードは以下のとおりです。
Worksheets(“Sheet1”).UsedRange.Copy Destination: = Worksheets(“Sheet2”).Range(“A1”)
Sheet1の書式設定も含めたセル範囲の内容を、Sheet2の指定した開始位置(セルA1)へペーストしています。
別のワークブックを指定する場合は、Workbooks(“Book2”).Worksheets(“Sheet1”)〜とすればOKです!
書式設定を一括で適用する
最後に、選択したセル範囲へ同じ書式設定を一括で適用するコードの一例を紹介します。
フォントサイズを12へ変更:
ActiveSheet.UsedRange.Font.Size = 12
フォントカラーを青に設定:
ActiveSheet.UsedRange.Font.Color = RGB(0, 0, 255)
セルの背景色を緑に設定:
ActiveSheet.UsedRange.Interior.Color = RGB(0, 255, 0)
UsedRangeを使うとセルの見た目をまとめて整えられるので非常に便利ですね!
VBAでUsedRangeを使用するメリット

ここまでUsedRangeプロパティの使い方を紹介しましたが、UsedRangeを使用することによるメリットは大きく分けて2つあります。
- 処理の効率性が向上する
- コードがシンプルになる
本セクションでは、以上の2つのメリットについて詳しく解説していきます。
処理の効率性が向上する
UsedRangeプロパティを使用すると操作を行いたいセルの範囲を絞れるので、シート全体に対して処理を行う場合よりも効率的です。
たとえば、データの読み込みや集計を行う際にUsedRangeを使うと、未使用のセルはスキップして読み込みや集計が行われるため、計算のリソースの無駄遣いを防げます。
セルの対象範囲を限定して、処理を効率良く行えるのがUsedRangeの大きなメリットです。
コードがシンプルになる
先ほども紹介したように、UsedRangeではセル範囲の選択を1行で書けますが、UsedRangeを使わずに書くと以下のようになります。
Dim lastColumn As Long
Dim usedRange As Range
Set ws = Worksheets(“Sheet1”)
‘最終行の取得
lastRow = ws.Cells.Find(“*”, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
‘最終列の取得
lastColumn = ws.Cells.Find(“*”, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
‘使用済み範囲を選択
ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastColumn)).Select
最終行と列を取得しなければいけないので、UsedRangeを使った方がシンプルになっていますね!
VBAでUsedRangeを使用するデメリット

UsedRangeを使うと処理の効率性が向上して、コードがシンプルになりますが、必ずしも意図した結果を返すとは限りません。そのため以下の点には注意する必要があります。
- 意図しない範囲を選択してしまう場合がある
- 最終行の番号を正しく取得できない場合がある
本セクションでは、UsedRangeを使用する2つのデメリットを紹介します。
意図しない範囲を選択してしまう場合がある
一度でも入力された、あるいは書式設定のあるセルもUsedRangeは使用済みセルと判断するので、「空白のセルなのに範囲に含まれていておかしい」と感じることもあるでしょう。
そのため、以下のように入力内容や書式をクリアするコードが必要な場合があります。
‘セルA2の入力内容のクリア
Worksheets(“Sheet1”).Range(“A2”).ClearContents
‘セルA2からC2までの書式設定のクリア
Worksheets(“Sheet1”).Range(“A2:C2”).ClearFormats
取得する範囲に含めたくないセルがある場合は上記のクリアを行いましょう。
最終行の番号を正しく取得できない場合がある
意図しないセル範囲を選択する際の一例として、最終行の番号を正しく取得できない場合が挙げられます。
たとえば、A1からA15のセルまでデータを入力していて、A11~A15の内容を消去しても書式設定が残っていると15行目が最終行と判断されてしまいます。
そのため、使用済みセル範囲の正しい最終行を取得するためにはEndプロパティを使用する必要がありますが、後のセクションで紹介しているのでぜひご確認ください!
VBAでUsedRangeがうまく動作しない時の代替手段

VBAでUsedRangeを使用するデメリットをご理解いただけたかと思いますが、他にもセル範囲を選択できるプロパティがVBAには存在しています。
- CurrentRegion
- End
本セクションでは、UsedRangeの代わりとなる以上の2つのプロパティの使い方を紹介していきます。
CurrentRegionプロパティ
CurrentRegionは指定したセルを含む連続したデータの範囲を取得できるプロパティです。
たとえば、A2〜D6の範囲の表に対して、連続してセルのデータが入っている範囲を取得するコードは以下のとおりになります。
‘セルB2を含む連続したデータが入っているセルの範囲「$A$2:$D$6」が返される
ActiveSheets.Range(“B2”).CurrentRegion.Address
UsedRangeとは異なり、CurrentRegionはデータが空白で書式の設定のみがされているセルは選択されないので、直感的に処理を実行できますね。
Endプロパティ
先ほども紹介したように、データが入っているセル範囲の最終行を厳密に取得するにはEndプロパティが有効です。
以下にコードの一例を紹介します。
Dim lastRow As Long
With Sheets(“Sheet1”)
lastRow = .Cells(.Rows.Count, “A”).End(xlUp).Row
End With
Sheet1のA列で最下行から上に向かって最初にデータが入っているセルを特定するため、結果としてデータが入っているセル範囲の最終行の番号を取得できます。
ちなみにEndプロパティの引数を「xlLeft」とすると、今度はA列の最右行から左に向かって最初にデータが入っているセル、つまりセル範囲の最終列の番号を取得することも可能です。
VBAによる業務効率化を生成AIで実現

VBAはデータ集計の自動化やメールの一括送信、Microsoft Officeアプリケーション間での連携を始めとする業務効率化のためによく使用されます。
実は、VBAと生成AIを組み合わせると、VBAを用いた自動化ツールの作成がさらに簡単になります。
たとえば、生成AIの代表格であるChatGPTに「UsedRangeプロパティを使って、Excel内のデータで平均値を計算するVBAのコードを作成して」と指示を出してみますね。
すると、わずか10秒程度で指示に合ったVBAのコードを生成してくれました。

画像をよく見ると、コードに対するコメントも生成されており、どこでどのような処理を行っているかが非常にわかりやすく出力されていますね。
今お見せしたChatGPTへの指示は非常に単純でしたが、さらに細かく指示すればメール送信やアプリケーション連携のような複雑なコードも書けるので、ぜひ試してみてください!
まとめ

本記事では、UsedRangeプロパティを使ってシート内の使用済みセル範囲の情報を取得する方法について解説していきました。
UsedRangeは特定のセル範囲に対して背景色や書式の変更を一括で行えるので、効率的に処理を実行できますが、意図していない範囲を選択する可能性があります。
そのため、CurrentRegionやEndプロパティを使ってデータが入力されているセルのみを厳密に選択する方法も有効です。
実行したい処理の内容や状況に応じて使い分けてみてください。
また、VBAで業務効率化ツールを作る際は、生成AIを使ってコードを書く時間自体を節約していきましょう!
