Excel VBA

The Range object in Excel VBA is an object that specifies a particular cell or range of cells on a worksheet, allowing you to freely read, write, and manipulate their values and formats.

Range [object]

Excel VBAを使ってマクロを組む上で最もよく登場し、かつ重要な概念の1つが「Range(レンジ)」オブジェクトです。セルやセル範囲を指定して操作を行う場合は、ほぼ必ず「Range」オブジェクトが関わってきます。

Rangeオブジェクトとは何か

概要
「Range」オブジェクトは、Excelシート上のセルやセル範囲を表します。
例えば、Range("A1")はA列1行目の単一セルを、Range("A1:C3")はA1からC3までの9セル分の範囲を示します。
Rangeオブジェクトを使う理由
セルの値の読み書き
数値や文字列、数式などセルに入力された情報を取得・変更できる。
フォーマットの変更
セルの文字色、背景色、フォントなどの書式設定をVBAコード上で行える。
高度な操作
フィルタ、ソート、コピー&ペースト、クリア、結合など、さまざまなメソッドやプロパティが用意されており、複雑な操作を自動化できる。

Rangeの基本的な指定方法

文字列によるセル参照

VBA

Range("A1")        ' A1セル
Range("A1:B10")    ' A1からB10までの範囲
Range("A:A")       ' A列全体
Range("1:1")       ' 1行目全体

ポイント

Cellsプロパティによる行・列番号指定

VBA

Cells(1, 1)     ' 行番号1, 列番号1 → A1セルと同じ
Cells(5, 2)     ' 行番号5, 列番号2 → B5セルと同じ
組み合わせ(RangeとCellsを組み合わせる)
Range(Cells(1,1), Cells(5,2))のようにすれば、A1からB5までの範囲が指定できます。
メリット
行番号・列番号を変数で指定することで柔軟にセル範囲を動的に変えられる。たとえば、データの最終行を求めて変数に代入し、その値を使用することで可変的な範囲指定が可能です。

ワークシートを明示的に指定する

VBA

Worksheets("Sheet1").Range("A1")
Worksheets("Sheet2").Cells(1, 1)

ポイント

Rangeオブジェクトの主なプロパティ

Value

概要
Rangeに含まれるセルの値を取得・設定するプロパティです。

VBA

' 値の読み取り
Dim val As Variant
val = Range("A1").Value

' 値の書き込み
Range("A2").Value = "こんにちは"
ポイント

Formula

概要
セルに設定されている**数式(=から始まる文字列)**を取得・設定するプロパティです。

VBA

' 数式をセット
Range("A1").Formula = "=SUM(B1:B5)"

' 数式の取得
Dim f As String
f = Range("A1").Formula
ポイント

Text / NumberFormat

Text
セルに表示されている文字列(表示形式)を取得します。例えば、日付の表示形式が変更されている場合でも、Textプロパティはシート上に見える表示と同じものを取得します。
NumberFormat
数値や日付などの表示形式を取得・設定できます。

VBA

Range("A1").NumberFormat = "yyyy/mm/dd"

Interior / Font などの書式関連

Interior
セルの背景色やパターンなど、塗りつぶしの書式を管理するオブジェクト。

VBA

Range("A1").Interior.Color = RGB(255, 255, 0)  ' 黄色
Font
フォントの色やサイズ、スタイルを管理するオブジェクト。

VBA

Range("A1").Font.Color = RGB(0, 0, 255)  ' 青色
Range("A1").Font.Bold = True            ' 太字
Range("A1").Font.Size = 14              ' フォントサイズ14

Row / Column / Rows / Columns

Row, Column
Rangeが示す最初のセルの行番号や列番号を取得します。

VBA

Debug.Print Range("B5").Row       ' → 5
Debug.Print Range("B5").Column    ' → 2
Rows, Columns
Range内の行全体、列全体を表すコレクション。

VBA

Range("A1:C3").Rows.Count     ' → 3 (行数)
Range("A1:C3").Columns.Count  ' → 3 (列数)

Rangeオブジェクトの主なメソッド

Clear / ClearContents / ClearFormats

Clear
セルの内容と書式の両方をクリアします。

VBA

Range("A1:C3").Clear
ClearContents
セルの**内容(値や数式)**だけをクリアし、書式は維持します。

VBA

Range("A1:C3").ClearContents
ClearFormats
セルの書式だけをクリアし、値や数式は維持します。

VBA

Range("A1:C3").ClearFormats

Copy / PasteSpecial

Copy
Rangeの内容をクリップボードにコピーします。

VBA

Range("A1:C3").Copy
コピー先を指定して一度にペーストする場合は、以下のように1行で書くこともできます。

VBA

Range("A1:C3").Copy Destination:=Range("E1")
PasteSpecial
計算結果のみを貼り付ける、書式のみ貼り付けるなど、特定の形式でペーストしたいときに使います。

VBA

Range("A1:C3").Copy
Range("E1").PasteSpecial Paste:=xlPasteValues

Sort

概要
範囲内のデータを並べ替えることができます。

VBA

With Worksheets("Sheet1")
	.Range("A1:C10").Sort _
		Key1:=.Range("A1"), Order1:=xlAscending, _
		Header:=xlYes
End With
ポイント

Find / Replace

Find
指定した範囲の中から特定の文字列や値を検索し、最初に見つかったセルのRangeを返します。

VBA

Dim foundCell As Range
Set foundCell = Range("A1:C10").Find(What:="検索ワード")
If Not foundCell Is Nothing Then
	MsgBox "見つかりました: " & foundCell.Address
End If
Replace
範囲内の文字列や値を置換します。

VBA

Range("A1:C10").Replace What:="置換前", Replacement:="置換後"

Select / Activate

概要
Rangeを選択状態にしたり、セルをアクティブにしたいときに利用します。

VBA

Range("A1:C3").Select
Range("A1").Activate
注意点

範囲操作の応用

Offset

概要
指定したRangeから行方向、列方向に相対移動した位置のRangeを返します。

VBA

' A1から1行下(=2行目)、2列右(=C列)へ移動 → C2
Range("A1").Offset(1, 2).Value = "Offsetサンプル"
活用例
繰り返し処理で毎回1行下へ移動しながら値を書き込むといった場合に便利。

Resize

概要
現在のRangeの行数・列数を変更したRangeを返します(始点はそのまま)。

VBA

' A1基点で縦5行×横2列に範囲を拡大 → A1からB5
Range("A1").Resize(5, 2).Interior.Color = RGB(200,200,200)

Union / Intersect

Union
複数のRangeを結合して1つのRangeとして扱います。

VBA

Dim rng1 As Range, rng2 As Range
Set rng1 = Range("A1:A3")
Set rng2 = Range("C1:C3")

Dim rngUnion As Range
Set rngUnion = Union(rng1, rng2)  ' A1:A3, C1:C3を合わせた範囲
rngUnion.Interior.Color = RGB(255, 230, 200)
Intersect
複数のRangeが重なり合う部分を取り出します。

VBA

Dim rngInt As Range
' A1:C3 と B2:D4 の重なり合う範囲は B2:C3
Set rngInt = Intersect(Range("A1:C3"), Range("B2:D4"))
If Not rngInt Is Nothing Then
	rngInt.Font.Bold = True
End If

Columns / Rows のプロパティを組み合わせた高度な範囲指定

例:指定したRange内の2列目だけを抜き出す方法

VBA

Dim rngAll As Range
Set rngAll = Range("A1:D10")

Dim rngSecondCol As Range
Set rngSecondCol = rngAll.Columns(2) ' A1:D10の2列目 → B1:B10
rngSecondCol.Interior.Color = RGB(200, 255, 200)

よくある実務・応用例

最終行・最終列の取得

概要
データがどこまで入っているかわからない場合でも、最終行や最終列を動的に求める方法はよく使われます。

VBA

Dim lastRow As Long
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")

' A列の最終行を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

' 例: A列の最終行までの範囲に対して何らかの処理
Dim rngData As Range
Set rngData = ws.Range("A1:A" & lastRow)
ポイント

For Each ループで複数セルを順番に処理

VBA

Dim c As Range
For Each c In Range("A1:A10")
	If c.Value > 100 Then
		c.Interior.Color = vbRed
	End If
Next c
ポイント

2次元配列を一括で読み書き

読み込み

VBA

Dim dataArr As Variant
dataArr = Range("A1:C10").Value  ' 10行×3列の配列を取得
書き込み

VBA

Range("D1:F10").Value = dataArr
ポイント

パフォーマンスの注意点

SelectやActivateを多用しない
不要な画面更新や選択操作が増えるため、コードの実行速度を低下させます。
大量データの場合は配列に一括で読み込み・書き込みを行う
1セルずつValueを読み書きするより大幅に高速です。
ScreenUpdatingやCalculationをオフにする
画面の再描画や計算を一時的に停止することで、重い処理を高速化できます。

VBA

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

' 重い処理...

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

エラー対策やよくあるトラブル

Range指定のミスによるエラー
文字列指定や行列番号指定で範囲外を指定すると、実行時エラーが起こる可能性があります。変数で行や列を指定する場合、値が不適切にならないように事前チェックを入れましょう。
ワークシートがアクティブでない状態でCellsを使用
Cells(1,1)と書くと、アクティブなシートに対して参照されるため、意図したシートでない可能性があります。必ず明示的にWorksheets("名前").Cells(...)とするのがおすすめです。
文字型のセル参照の誤り
Range("1:1")とするつもりがRange("1")だけになったり、シングルクォートのつけ忘れでシート名が不正になったりするケースがあります。特に日本語やスペースが入ったシート名は要注意です。

まとめ

Rangeオブジェクトは、Excel VBAを扱う上で最も中心的なオブジェクトと言っても過言ではありません。セルの値の読み書きはもちろん、書式設定やコピー、フィルタ、ソート、Find/Replaceなど、多岐にわたる機能が集約されています。