「セルの範囲を選択する方法が分からない」
「UsedRangeって聞いたことはあるけど、使い方が分からない…」
Excel VBAのコードを書く際に上記のように思われる方も多いのではないでしょうか。セル範囲の選択にはUsedRangeプロパティが役に立ちます。
本記事では、UsedRangeの使い方からメリットやデメリット、その代替手段まで詳しく紹介しています。生成AIを用いた業務効率化の方法も解説しているので、ぜひ参考にしてみてください。
- UsedRangeプロパティはシート上の使用済みセル範囲を特定できる
- コードがシンプルになるが、意図しない範囲が選択される可能性もある
- 代替手段としてCurrentRegionやEndプロパティがある
VBAで用いるUsedRangeとは?
UsedRangeとは、ExcelのVBAでワークシート内のデータが存在するセル範囲を指すプロパティです。UsedRangeはシート上で一度でも値が入力された最も左上のセルから最も右下のセルまでの範囲を自動的に識別します。
UsedRangeを使ったセル範囲に対してSelectプロパティを使うと、アクティブシート内の使用済みのセル範囲の選択が行えます。
UsedRangeプロパティの使い方
UsedRangeはシート内のセル範囲を選択できることを利用して、主に以下の用途で使用されるケースが多いようです。
- 使用済みのセル範囲を取得する
- 開始行や最終行を取得する
- 開始列や最終列を取得する
- 別のワークシートにコピー&ペーストする
- 書式設定を一括で適用する
一つずつサンプルコードを紹介しながら解説していきます。
使用済みのセル範囲を取得する
Selectプロパティで使用済みのセル範囲を選択するだけでは、実際にその範囲を取得できているかどうかは確認できません。
そのため、選択された範囲を取得する場合は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プロパティを使ってデータが入力されているセルのみを厳密に選択する方法も有効です。実行したい処理の内容や状況に応じて使い分けてみてください。
また、生成AIを使えば、コーディングできない初心者でも簡単にコードが書けるようになります。VBAで業務効率化ツールを作る際は、生成AIを使ってコードを書く時間自体を節約していきましょう!