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.
Excel VBAを使ってマクロを組む上で最もよく登場し、かつ重要な概念の1つが「Range(レンジ)」オブジェクトです。セルやセル範囲を指定して操作を行う場合は、ほぼ必ず「Range」オブジェクトが関わってきます。
Range("A1")
はA列1行目の単一セルを、Range("A1:C3")
はA1からC3までの9セル分の範囲を示します。
VBA
Range("A1") ' A1セル
Range("A1:B10") ' A1からB10までの範囲
Range("A:A") ' A列全体
Range("1:1") ' 1行目全体
ポイント
"A:A"
や"1:1"
のように指定します。VBA
Cells(1, 1) ' 行番号1, 列番号1 → A1セルと同じ
Cells(5, 2) ' 行番号5, 列番号2 → B5セルと同じ
Range(Cells(1,1), Cells(5,2))
のようにすれば、A1からB5までの範囲が指定できます。VBA
Worksheets("Sheet1").Range("A1")
Worksheets("Sheet2").Cells(1, 1)
ポイント
Sheets("Sheet1")
という書き方でも同様に指定可能ですが、Worksheets
コレクションの方が「通常のワークシート」に絞り込みやすいメリットがあります(グラフシートやダイアログシートを除外したい場合など)。VBA
' 値の読み取り
Dim val As Variant
val = Range("A1").Value
' 値の書き込み
Range("A2").Value = "こんにちは"
Range("A1:B2").Value
は2×2の配列を返します。VBA
' 数式をセット
Range("A1").Formula = "=SUM(B1:B5)"
' 数式の取得
Dim f As String
f = Range("A1").Formula
"="
から書き始める。"=SUM($B$1:B5)"
など)。VBA
Range("A1").NumberFormat = "yyyy/mm/dd"
VBA
Range("A1").Interior.Color = RGB(255, 255, 0) ' 黄色
VBA
Range("A1").Font.Color = RGB(0, 0, 255) ' 青色
Range("A1").Font.Bold = True ' 太字
Range("A1").Font.Size = 14 ' フォントサイズ14
VBA
Debug.Print Range("B5").Row ' → 5
Debug.Print Range("B5").Column ' → 2
VBA
Range("A1:C3").Rows.Count ' → 3 (行数)
Range("A1:C3").Columns.Count ' → 3 (列数)
VBA
Range("A1:C3").Clear
VBA
Range("A1:C3").ClearContents
VBA
Range("A1:C3").ClearFormats
VBA
Range("A1:C3").Copy
VBA
Range("A1:C3").Copy Destination:=Range("E1")
VBA
Range("A1:C3").Copy
Range("E1").PasteSpecial Paste:=xlPasteValues
VBA
With Worksheets("Sheet1")
.Range("A1:C10").Sort _
Key1:=.Range("A1"), Order1:=xlAscending, _
Header:=xlYes
End With
Sort
メソッドは、必ずRangeに対して行います(ListObjectなどを使う方法もありますが、ここでは割愛)。Header:=xlYes
を指定。VBA
Dim foundCell As Range
Set foundCell = Range("A1:C10").Find(What:="検索ワード")
If Not foundCell Is Nothing Then
MsgBox "見つかりました: " & foundCell.Address
End If
VBA
Range("A1:C10").Replace What:="置換前", Replacement:="置換後"
VBA
Range("A1:C3").Select
Range("A1").Activate
Select
やActivate
を多用せずに、直接オブジェクトを操作することを推奨する風潮があります。不要な「選択」はパフォーマンスの低下やコードの可読性を悪化させる一因となるためです。VBA
' A1から1行下(=2行目)、2列右(=C列)へ移動 → C2
Range("A1").Offset(1, 2).Value = "Offsetサンプル"
VBA
' A1基点で縦5行×横2列に範囲を拡大 → A1からB5
Range("A1").Resize(5, 2).Interior.Color = RGB(200,200,200)
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)
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
例:指定した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)
End(xlUp)
は上方向へ移動して最初に見つかったセルを返す動作です(xlDown
、xlToLeft
、xlToRight
も同様の考え方)。Rows.Count
)はバージョンによって違う(Excel 2007以降は1,048,576行)ため、Rows.Count
は標準的に1,048,576を返します。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
VBA
Dim dataArr As Variant
dataArr = Range("A1:C10").Value ' 10行×3列の配列を取得
VBA
Range("D1:F10").Value = dataArr
VBA
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' 重い処理...
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Cells(1,1)
と書くと、アクティブなシートに対して参照されるため、意図したシートでない可能性があります。必ず明示的にWorksheets("名前").Cells(...)
とするのがおすすめです。Range("1:1")
とするつもりがRange("1")
だけになったり、シングルクォートのつけ忘れでシート名が不正になったりするケースがあります。特に日本語やスペースが入ったシート名は要注意です。Rangeオブジェクトは、Excel VBAを扱う上で最も中心的なオブジェクトと言っても過言ではありません。セルの値の読み書きはもちろん、書式設定やコピー、フィルタ、ソート、Find/Replaceなど、多岐にわたる機能が集約されています。