Excel

VBAで範囲選択をするには?RangeとCellsを使った方法を紹介

ExcelのVBAでプログラミングをする時には、ほぼ必ずと言ってもいいほど範囲を選択します。

Excel VBAで範囲選択をするには主に「Rangeプロパティ」と「Cellsプロパティ」を使いますが、どちらを使えば良いのか迷ってしまうことがあります。

本日は「Range」「Cells」それぞれの範囲選択方法や特徴などを紹介します。

範囲指定方法

画像のようなセルA1~E5にデータが入力されていて、この範囲を選択します。

Rangeを使って範囲選択をする方法

VBAサンプル

Sub ボタン1_Click()
    ThisWorkbook.ActiveSheet.Range("A1:E5").Select 
End Sub

ボタンを一つ作成して、ボタンをクリックした時に動くプログラムです。

「ThisWorkbook」は現在開いているExcelファイルの事です。

「ActiveSheet」はアクティブになっているシートを指します。シートが複数あって特定のシートを指定したい場合は「WorkSheets」を使いますが、シートが1つだけであればActiveSheetで問題ありません。

「Range」で範囲を指定します。

範囲指定は「指定したい最初のセル:せていしたい最後のセル」と入力します。

シートの一番左上のセルを「A1」として横にずれる場合はアルファベットを変えていき、縦にずれる場合は数字を変えていきます。

Cellsを使って範囲選択をする方法

VBAサンプル

Sub ボタン1_Click()
  ThisWorkbook.ActiveSheet.Range(Cells(1, 1), Cells(5, 5)).Select
End Sub

実はCellsプロパティを使って範囲選択をする場合もRangeプロパティを使います。

Rangeプロパティの中に最初のセルと最後のセルをCellsプロパティを使って記述します。

Cellsプロパティは行・列それぞれのインデックス番号で指定するので分かりにくいですが、慣れてしまえばどってことありません。

記述の方法はCells(行インデックス番号,列インデックス番号)という形です。一番左上のセルA1は行・列それぞれインデックス番号は「1」です。

サンプルで Range(Cells(1,1),Cells(5,5)) と記述していますが、A1がCells(1,1)でE5がCells(5,5)となり、Rangeプロパティ内で指定することで範囲指定することができます。

RangeとCellsの使いどころ

ExcelのVBAにセルを選択できるプロパティが2つあるということは、それぞれで使いどころが違うということです。

Rangeプロパティの使いどころ

  • 範囲指定をする時に使う
  • 行、列のインデックスが分からない時に使う
  • 範囲を複数選択する場合に使う

Cellsプロパティの使いどころ

  • 繰り返し処理の中で範囲を指定する場合に使う
  • シート全体を指定する場合に使う

色々な範囲選択方法

複数の範囲を選択する方法

セルA1~B2とD4~E5など複数範囲を選択することもあります。

そんな時にはRangeプロパティを使って範囲を複数指定することで選択することができます。

VBAサンプル

Sub ボタン1_Click()
  ThisWorkbook.ActiveSheet.Range("A1:B2,D3:E4").Select
End Sub

Rangeプロパティ内で選択範囲をカンマ(,)で区切って指定します。サンプルでは2つの選択範囲ですが、3つ以上の選択範囲を指定することも可能です。

変数を使ってセルを指定する方法

指定するセルが可変の場合は変数を使ってセルを指定するのが一般的です。

VBAサンプル

Sub ボタン1_Click()
  For i = 1 To 5
      MsgBox (ThisWorkbook.ActiveSheet.Cells(1, i).Value)
  Next
End Sub

使いどころでも説明をしましたが、指定する変数が可変の時にはCellsプロパティを使用します。

繰り返し処理で使用する変数iには繰り返し処理をした回数が1~5まで代入されるので、その変数を使用してCellsプロパティのインデックス番号を指定します。

サンプルでは列のインデックス番号を変数で指定しているので横に移動していきますが、縦に移動させたい場合は、行のインデックス番号を変数で指定します。

空白を挟んだ選択範囲を指定する方法

画像のようなシートがあり、空白を挟んだG列と7行目も選択範囲として選択したい場合には行・列それぞれの最終のインデックス番号を取得する必要があります。

VBAサンプル

Sub ボタン1_Click()
    Dim MaxRow As Double
    Dim MaxRowNumber As Double
    MaxRow = Rows.Count 'シート最大列インデックス番号
    MaxRowNumber = Cells(MaxRow, 1).End(xlUp).Row 'シート内で文字が入力されている
                                                  '最大列インデックス番号
   
    Dim MaxColumn As Double
    Dim MaxColumnNumber As Double
   
    MaxColumn = Columns.Count 'シート最大行インデックス番号
    MaxColumnNumber = Cells(1, MaxColumn).End(xlToLeft).Column 'シート内で文字が入力されている
                                                               '最大行インデックス番号
   
    ThisWorkbook.ActiveSheet.Range(Cells(1, 1), _
    Cells(MaxColumnNumber, MaxColumnNumber)).Select
End Sub

まずEndプロパティを使って行・列の最大インデックス番号を取得します。

Endプロパティの使い方は以前記事にしていますので、詳しい説明を見たい方はこちらをご覧ください。

Rangeプロパティの中にCellsを使って範囲指定をしますが、最後のセルを指定する時に行・列それぞれの最大インデックス番号を指定します。

最後に

ExcelのVBAで範囲選択をする方法を紹介しました。

Excelを使っていて範囲指定をすることは多く、これを自動化できると業務効率が上がります。

ここで紹介したサンプルは全てコピペをすればすぐに使えるので、気になったサンプルはぜひ使ってみてください。