Range は「シート上の“セルや範囲”そのもの」
まずイメージからいきます。
Range オブジェクト = シート上の「セル1つ」または「セルのかたまり」そのもの です。
A1 だけを指す Range もあれば、A1:C3 のように複数セルをまとめて指す Range もあります。
VBA で「どこに書くか」「どこから読むか」を決めるとき、最後は必ず Range に行き着きます。
Workbook(ブック)
→ Worksheet(シート)
→ Range(セル・範囲)
という“階層”を意識できると、一気に世界がクリアになります。
Range の一番基本:セルを1つ指定して値を読み書きする
A1 に値を書き込む・読み取る
いちばんシンプルな形からいきます。
Sub SampleRangeBasic()
Range("A1").Value = "こんにちは"
End Sub
VBこれは「アクティブなシートの A1 に “こんにちは” と書く」という意味です。
値を読み取るときはこうです。
Sub SampleRangeRead()
Dim msg As String
msg = Range("A1").Value
MsgBox "A1 の値は「" & msg & "」です。"
End Sub
VBここで重要なのは、
Range(“A1”) は「セル A1 そのもの」.Value は「そのセルの値」
という関係です。
Range は“場所”、Value は“中身”です。
「どのシートの Range か」をはっきりさせる
ws.Range(“A1”) という書き方に慣れる
超初心者のうちから、ここを強く意識してほしいです。
Range("A1")
VBだけだと、「アクティブなシートの A1」になってしまいます。
どのシートがアクティブかによって、書き込まれる場所が変わるので、バグの元です。
一方で、こう書くとどうでしょう。
Sub SampleRangeWithSheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1").Value = "ここは入力シートの A1"
End Sub
VBws が「入力シート」を指しているので、ws.Range("A1") は「入力シートの A1」とハッキリ決まります。
大事なポイントは、
Range だけで書かず、
必ず「どのシートか」を前に付けてws.Range("A1") の形で書く癖をつけること
です。
これだけで、将来のバグがかなり減ります。
複数セルの範囲を Range で扱う
“A1:C3” のように範囲を文字列で指定する
Sub SampleRangeMulti()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1:C3").Value = "★"
End Sub
VBこのコードは、「入力シートの A1 から C3 まで、9セル全部に “★” を入れる」という意味です。
Range(“A1:C3”) は、「A1 から C3 までの長方形の範囲」を表す Range オブジェクトです。
単一セルでも複数セルでも、どちらも Range です。
別の範囲にまとめてコピーする
Sub SampleRangeCopy()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1:C3").Copy Destination:=ws.Range("E1")
End Sub
VBこれは、「A1:C3 をコピーして、E1 から始まる位置に貼り付ける」という意味です。
コピー元もコピー先も、どちらも Range です。
Cells と組み合わせて「行・列番号」で指定する
Cells(row, column) と Range の違い
Range(“A1”) は「A1」という“住所”で指定しますが、
Cells(行番号, 列番号) を使うと、数字で指定できます。
Sub SampleCellsBasic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Cells(1, 1).Value = "A1 と同じ場所"
ws.Cells(3, 2).Value = "B3 に書き込み"
End Sub
VBCells(1, 1) は A1、Cells(3, 2) は B3 です。
Range と Cells はよく組み合わせて使います。
例えば、「A1 から、行番号・列番号で指定したセルまで」の範囲を取りたいとき。
Sub SampleRangeWithCells()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range(ws.Cells(1, 1), ws.Cells(3, 2)).Value = "★"
End Sub
VBこれは「A1 から B3 までの範囲全部に “★”」という意味です。
行・列を変数で動かしたいときに、とても強力なパターンです。
Range を変数に入れてから使う
Range 変数を使うと、コードが読みやすくなる
Range もオブジェクトなので、変数に入れて扱えます。
Sub SampleRangeVariable()
Dim ws As Worksheet
Dim rng As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set rng = ws.Range("A1:C3")
rng.Value = "まとめて書き込み"
End Sub
VBrng が「入力シートの A1:C3」を指しているので、rng.Value でその範囲全体を一気に操作できます。
この書き方の良さは、
どのシートのどの範囲を触っているのか
一度 Set したら、その後は短く書ける
というところです。
Range を使うときに意識してほしい重要ポイント
「ブック → シート → Range」という順番を崩さない
いきなり
Range("A1").Value = 1
VBと書くのではなく、頭の中で必ずこう分解して考えてください。
どのブックか → ThisWorkbook や Workbooks(“名前”)
どのシートか → Worksheets(“名前”)
どのセル・範囲か → Range(“A1”) や Range(“A1:C3”)
コードもその順番で書くと、迷いがなくなります。
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks("売上集計.xlsx")
Set ws = wb.Worksheets("集計")
ws.Range("A1").Value = "OK"
VBこの形が「きれいな基本形」です。
ActiveSheet や「省略された Range」に頼りすぎない
アクティブなシートに対して Range を書くと、
ユーザーの操作や他のコードに振り回されて、意図しない場所を書き換えるリスクがあります。
超初心者のうちから、
どのブックか
どのシートか
その上でどの Range か
を毎回はっきり書く癖をつけておくと、
後で「なんでここが書き換わってるの?」という事故をかなり防げます。
まとめ:Range は「最終的にデータが出入りする“場所”」
Range の本質は、
「シート上の“どこ”を触るのかを表すオブジェクト」
です。
押さえておきたいポイントをコンパクトにまとめると、
Range(“A1”) はセル A1、Range(“A1:C3”) はその範囲全体
必ず「どのシートか」を付けて ws.Range("A1") の形で書く
Cells(行, 列) と組み合わせると、行・列番号で柔軟に指定できる
Range を変数に Set してから使うと、読みやすくて安全なコードになる
