更新日:、 作成日:

VBA セルを範囲指定して取得する (Range, Cells)

はじめに

Excel VBA マクロでセルを範囲指定する方法や、セルの範囲を取得する方法を紹介します。

Range("B1") または Cells(1, 2) プロパティから、セル「B1」を取得できます。

Range("A1:B2") プロパティから、セルの範囲「A1」~「B2」を取得できます。Cells からシート全体を取得できます。

ActiveCell から、アクティブセルを取得できます。

Selection から、範囲選択しているセルを取得できます。

セルの位置を取得する「セルの位置を取得する」をご覧ください。
セルを選択するには「セルを選択する」をご覧ください。

セルを範囲指定して取得する

Range を使用してセルを範囲指定して取得できます。Cells からシート全体を取得できます。

セル名を指定

Range の引数にセル名を指定すると、そのセルを取得できます。

セル「A1」を取得するには Range("A1") を入力します。

Dim c As Range
Set c = Range("A1")
Debug.Print(c.Value)
4

行と列番号を指定

Cells の引数にセルの行と列の番号を指定すると、そのセルを取得できます。

行「2」、列「A」のセルを取得するには Cells(2, 1) を入力します。

Dim c As Range
Set c = Cells(1, 1) ' A1
Set c = Cells(2, 1) ' A2
Set c = Cells(1, 2) ' B1
Set c = Cells(2, 2) ' B2
Debug.Print(c.Value)
5

セルを範囲指定

セルの範囲「A1」~「B2」を取得するには Range("A1:B2") または Range("A1", "B2") を入力します。または直接そのセルを指定します。

Dim c As Range
Set c = Range("A1:B2")
Set c = Range("A1", "B2")
Set c = Range(Range("A1"), Range("B2"))
Set c = Range(Cells(1, 1), Cells(2, 2))
c.Select

シート全体

シート全体のセルを取得するには Cells を入力します。

Dim c As Range
Set c = Cells ' すべてのセル
c.Select

離れたセルを指定

セル「A1」と「B2」を取得するには Range("A1, B2") を入力します。

Dim c As Range
Set c = Range("A1, B2")
c.Select

または Union(Range("A1"), Range("B2")) を入力します。

Union を使用すると、指定した 2 つのセルを組み合わせた範囲を取得できます。

Dim c As Range
Set c = Union(Range("A1"), Range("B2")) ' A1 と B2
Set c = Union(c, Range("C3:D4"))        ' A1 と B2 と C3 ~ D4
c.Select

セルを指定して取得する

アクティブセルを取得

アクティブセルを取得するには ActiveCell を入力します。

Dim c As Range
Set c = ActiveCell
Debug.Print(c.Value)
6

アクティブセルとは、フォーカスがあるセルのことです。

選択セルを取得

選択しているセルを取得するには Selection を入力します。範囲選択しているときは、その範囲のセルを取得します。

Dim s As Range
Set s = Selection

Dim c As Range
For Each c In s
    Debug.Print(c.Value)
Next
7

前のセルを取得

指定したセルの左のセルを取得するには Range.Previous を入力します。

これは Excel で Shift + Tab キーを入力したときと同じセルを取得します。

A 列のセルで Previous を入力するとエラーになります。

セルの範囲「B1」~「C2」で Previous を入力するとセル「A1」が取得されます。セルの範囲の左上のセル「B1」の左のセルが取得されます。

Dim c As Range
Set c = ActiveCell.Previous
Set c = Range("C2").Previous
Debug.Print(c.Value)
8

次のセルを取得

指定したセルの次のセルを取得するには Range.Next を入力します。

これは Excel で Tab キーを入力したときと同じセルを取得します。

セルの範囲「A1」~「B2」で Next を入力するとセル「B1」が取得されます。セルの範囲の左上のセル「A1」の右のセルが取得されます。

Dim c As Range
Set c = ActiveCell.Next
Set c = Range("B2").Next
Debug.Print(c.Value)
9

最終セルを取得

指定したセルの終端を取得するには Range.End(方向) のように入力します。

これは Excel で Ctrl + ↑↓←→ キーを入力したときと同じセルを取得できます。

方向には次のものがあります。

定数名 説明
xlUp-4162上端
xlDown-4121下端
xlToLeft-4159左端
xlToRight-4161右端
Dim c As Range
Set c = ActiveCell.End(xlUp)   ' アクティブセルの上端のセルを取得
Set c = ActiveCell.End(xlDown) ' アクティブセルの下端のセルを取得
Debug.Print(c.Value)

セル「B2」で xlDown を指定したときは、セル「B6」を取得します。

セル「C2」で xlDown を指定したときは、セル「C3」を取得します。

3

指定したセルから Excel で Ctrl + ↑↓←→ キーを入力したときの範囲のセルを取得するには次のように入力します。

Dim c As Range
Set c = Range("D6") ' D6 を基準にして取得
Range(Cells(c.End(xlUp).Row, c.End(xlToLeft).Column), Cells(c.End(xlDown).Row, c.End(xlToRight).Column)).Select

移動した位置を取得

指定したセルから移動した位置のセルを取得するには Range.Offset を入力します。

セル「B2」から行「1」、列「0」移動したセルを取得するには Range("B2").Offset(1, 0) を入力します。

Dim c As Range
Set c = Range("B2")
Debug.Print(c.Offset(1, 0).Value)  ' B3
Debug.Print(c.Offset(-1, 0).Value) ' B1
Debug.Print(c.Offset(0, 1).Value)  ' C2
Debug.Print(c.Offset(0, -1).Value) ' A2
10

行数に正の値を指定すると下に、負の値を指定すると上に移動します。

列数に正の値を指定すると右に、負の値を指定すると左に移動します。

Cells でも移動した位置のセルを取得できます。

Dim c As Range
Set c = Range("B2")
Debug.Print(c.Cells(2, 1).Value) ' B3
Debug.Print(c.Cells(0, 1).Value) ' B1
Debug.Print(c.Cells(1, 2).Value) ' C2
Debug.Print(c.Cells(1, 0).Value) ' A2

Offset と Cells の違いは次の通りです。

  • Offset:基準のセルは (0, 0)、基準がセルの範囲のときは移動したセルの範囲を取得。
  • Cells:基準のセルは (1, 1)、基準がセルの範囲のときは、左上のセルから移動したセルを取得

その他を範囲指定して取得する

行を取得

行「2」を取得するには Rows(2) を入力します。

Dim r As Range
Set r = Rows(2) ' 2 行目
r.Select
詳しくは「行を取得する」をご覧ください。

列を取得

列「A」を取得するには Columns(1) または Columns("A") を入力します。

Dim r As Range
Set r = Columns(1)   ' A 列
Set r = Columns("A") ' A 列
Set r = Columns(3)   ' C 列
r.Select
詳しくは「列を取得する」をご覧ください。

行数と列数を指定して取得

セル「B2」から行数 2 と列数 3 の範囲を取得するには Range("B2").Resize(2, 3) を入力します。セルの範囲「B2」~「D3」を取得します。

Dim c As Range
Set c = Range("B2").Resize(2, 3)
c.Select

セルの範囲に対して入力すると、範囲を拡張したり縮小したりできます。引数を片方だけ指定すると、もう片方は指定した範囲のままです。

Dim c As Range
Set c = Range("B2:C3").Resize(RowSize:=1)    ' 行数のみ縮小 (B2:C2)
Set c = Range("B2:C3").Resize(RowSize:=3)    ' 行数のみ拡大 (B2:C4)
Set c = Range("B2:C3").Resize(ColumnSize:=1) ' 列数のみ縮小 (B2:B3)
Set c = Range("B2:C3").Resize(ColumnSize:=3) ' 列数のみ拡大 (B2:D3)
c.Select

データの範囲を取得

指定したセルを囲むデータがある範囲を取得するには Range.CurrentRegion を入力します。

これは Excel で Ctrl + Shift + * キーを入力したときと同じセルを取得します。

Dim c As Range
Set c = Range("B2").CurrentRegion
Set c = Range("B6").CurrentRegion
Set c = Range("B10").CurrentRegion
c.Select

セル「B2」、「B6」、「B10」で実行すると、次の範囲が取得されます。

1

使用されている範囲を取得

使用されているセルの最大範囲を取得するには UsedRange を入力します。

Dim c As Range
Set c = UsedRange
c.Select

最大範囲とはシートに入力されている一番上、下、左、右のセルの範囲です。書式設定されているセルも含まれます。

2

条件に一致するセルを取得

条件に一致するセルを取得するには Range.SpecialCells(条件) のように入力します。

1 つのセルに対して指定すると、シート全体で条件に一致するセルを取得します。

セルの範囲に対して指定すると、その範囲内で条件に一致するセルを取得します。

条件には次のものがあります。

定数名 説明
xlCellTypeAllFormatConditions-4172条件付き書式が設定されているセル
xlCellTypeAllValidation-4174入力規制が設定が含まれているセル
xlCellTypeBlanks4空のセル
xlCellTypeComments-4144コメントが含まれているセル
xlCellTypeConstants2定数が入力されているセル
xlCellTypeFormulas-4123数式が入力されているセル
xlCellTypeLastCell11シート全体の最後のセル
xlCellTypeSameFormatConditions-4173同じ条件付き書式が設定されているセル
xlCellTypeSameValidation-4175同じ入力規制が設定が含まれているセル
xlCellTypeVisible12非表示になっていないセル

xlCellTypeConstants か xlCellTypeFormulas を指定したときは、第 2 引数に次の値を組み合わせて指定できます。

定数名 説明
xlErrors16エラー値
xlLogical4論理値
xlNumbers1数値
xlTextValues2文字
Dim c As Range
' シート全体から文字が入っているセルを取得
Set c = ActiveCell.SpecialCells(xlCellTypeConstants, xlTextValues)

' シート全体から文字と数値が入っているセルを取得
Set c = ActiveCell.SpecialCells(xlCellTypeConstants, xlTextValues Or xlNumbers)

' シート全体からコメントが設定されているセルを取得
Set c = Cells.SpecialCells(xlCellTypeComments)

' A1 ~ C3 の範囲から文字が入っているセルを取得
Set c = Range("A1:C3").SpecialCells(xlCellTypeConstants, xlTextValues)
c.Select

条件に一致するセルが見つからないときは「エラー 1004 アプリケーション定義またはオブジェクト定義のエラーです。」が発生します。

セルの範囲を操作する

セルの範囲など複数のセルを取得したときは For Each ですべてのセルを操作できます。

Dim r As Range
Set r = Range("A1:B2") ' A1 ~ B2

Dim c As Range
For Each c In r
    Debug.Print(c.Value) ' A1, B1, A2, B2 の順で取得
Next

別シートのセルを取得する

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
Dim c As Range
' Sheet1 のセル「A1」を取得
Set c = Worksheets("Sheet1").Range("A1")
Set c = Worksheets(1).Range("A1")

' Sheet2 のセル「A1」を取得
Set c = Worksheets("Sheet2").Range("A1")
Set c = Worksheets(2).Range("A1")

Sheet1 に Range や Cells を入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Range("A1").Value = "Sheet1"
Me.Range("A1").Value = "Sheet1"

標準モジュールに Range や Cells を入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Range("A1").Value = "アクティブ"
ActiveSheet.Range("A1").Value = "アクティブ"