Offset は「基準セルから“何行・何列ずらした場所”を指すための道具」
Offset は、あるセル(または範囲)を「基準」にして、
そこから上下左右に「何行・何列ずらした場所」を指すためのプロパティです。
「A1 の 1 行下(A2)」
「B3 の 2 行下・1 列右(C5)」
「このセルのすぐ右隣」
といった“相対的な位置”を扱うときに、Offset がものすごく便利になります。
Range や Cells が「絶対的な住所(A1、行3列2)」だとしたら、
Offset は「ここから何行・何列ずらす?」という“相対指定”です。
Offset の基本構文と、最もシンプルな使い方
基本構文
書き方はこうです。
Range(基準).Offset(行方向のずれ, 列方向のずれ)
VB行方向:下がプラス、上がマイナス
列方向:右がプラス、左がマイナス
というルールです。
A1 の 1 行下に書き込む
Sub SampleOffsetBasic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1").Value = "基準"
ws.Range("A1").Offset(1, 0).Value = "A1 の 1 行下(A2)"
End Sub
VBRange("A1").Offset(1, 0) は、「A1 から 1 行下・0 列右」= A2 を指します。
ここで重要なのは、
「Offset は“元の Range を動かした結果の Range”を返す」
ということです。
元の Range は動きません。あくまで「基準+ずれた先」を指す新しい Range が返ってきます。
行方向・列方向のずれをイメージでつかむ
下にずらす・上にずらす
Range("B3").Offset(1, 0) ' B4(1行下)
Range("B3").Offset(-1, 0) ' B2(1行上)
Range("B3").Offset(5, 0) ' B8(5行下)
VB行方向の引数は「下がプラス、上がマイナス」です。
右にずらす・左にずらす
Range("B3").Offset(0, 1) ' C3(1列右)
Range("B3").Offset(0, -1) ' A3(1列左)
Range("B3").Offset(0, 3) ' E3(3列右)
VB列方向の引数は「右がプラス、左がマイナス」です。
行と列を同時にずらす
Range("B3").Offset(2, 1) ' 2行下・1列右 → C5
Range("C5").Offset(-2, -1) ' 2行上・1列左 → B3
VB「基準から何行・何列ずらすか」を、
頭の中で“上下左右の矢印”としてイメージできるようになると、一気に使いやすくなります。
Offset を使うと「隣のセル」「一つ下のセル」が自然に書ける
「このセルのすぐ右隣」に書きたい
例えば、A 列に名前、B 列に点数を入れたいとします。
A 列に名前を書いたあと、「その右隣のセル」に点数を書きたいとき。
Sub SampleOffsetRight()
Dim ws As Worksheet
Dim r As Long
Set ws = ThisWorkbook.Worksheets("入力")
r = 2 ' 2行目から
ws.Cells(r, 1).Value = "山田"
ws.Cells(r, 1).Offset(0, 1).Value = 80 ' 右隣(B列)に点数
End Sub
VBws.Cells(r, 1) が A 列、
その .Offset(0, 1) が「同じ行の右隣(B 列)」です。
「基準セルから見て“隣”」という発想で書けるので、
列番号をいちいち数えなくてよくなります。
「このセルの一つ下」に書きたい
Sub SampleOffsetDown()
Dim ws As Worksheet
Dim r As Long
Set ws = ThisWorkbook.Worksheets("入力")
r = 2
ws.Cells(r, 1).Value = "1件目"
ws.Cells(r, 1).Offset(1, 0).Value = "2件目"
End Sub
VBOffset(1, 0) は「1 行下」です。
「今書いたセルのすぐ下に、次のデータを書きたい」といったときに、非常に自然に書けます。
ループと Offset の組み合わせで「表をスルスル走る」
基準セルから下方向にデータを書き込む
Sub SampleOffsetLoop()
Dim ws As Worksheet
Dim i As Long
Dim startCell As Range
Set ws = ThisWorkbook.Worksheets("入力")
Set startCell = ws.Range("A2") ' 基準セル
For i = 0 To 9
startCell.Offset(i, 0).Value = i + 1
Next i
End Sub
VBここでの流れは、
基準セルを A2 と決める
i を 0~9 で回す
Offset(i, 0) で「A2 から i 行下」を指す
というものです。
結果として、A2~A11 に 1~10 が書き込まれます。
重要なのは、
「基準セルを Range 変数に握っておき、Offset で相対的に動く」
というパターンです。
これができると、「どこから始めても同じロジックで動く」コードが書けるようになります。
Offset と Range/Cells の関係を整理する
Offset は「Range(または Cells)にぶら下がるプロパティ」
Offset は単体では使えません。
必ず「何かの Range(または Cells)」に対して使います。
ws.Range("B3").Offset(1, 0)
ws.Cells(5, 2).Offset(-2, 3)
VBどちらも、
元の Range(B3 や Cells(5,2))
そこから Offset(行, 列) でずらした先の Range
という関係です。
つまり、
Range や Cells → 「基準の場所」
Offset → 「そこからのずれ」
という役割分担になっています。
Offset を使うときに意識してほしい重要ポイント
「絶対位置」ではなく「相対位置」で考える癖をつける
Range(“A1”) や Cells(3, 2) は「絶対的な場所」です。
一方、Offset は「今いる場所からどれだけ動くか」という“相対的な場所”です。
実務でよくあるのは、
見出しのセルは毎回同じだけど、データの開始位置は変わる
検索で見つけたセルの右隣に値を書きたい
合計セルの一つ上までを範囲にしたい
といった、「基準は分かるけど、そこからの距離で場所を決めたい」ケースです。
そういうときに、Offset を使うとコードが一気に自然になります。
行方向・列方向の符号(プラス・マイナス)を体で覚える
下がプラス、上がマイナス
右がプラス、左がマイナス
このルールは、何度も書いて体で覚えるのが一番です。
「Offset(1, 0) は 1 行下」
「Offset(0, 1) は 1 列右」
ここだけまず完全に覚えてしまえば、あとはそこからの応用です。
まとめ:Offset は「基準セルからの“ずれ”で場所を決めるための魔法のレバー」
Offset の本質は、
「あるセル(または範囲)を基準にして、そこから何行・何列ずらした場所を指す」
ことです。
押さえておきたいポイントをコンパクトにまとめると、
Offset(行, 列) は「下がプラス・上がマイナス/右がプラス・左がマイナス」
Range や Cells に対して使い、「基準+ずれた先」の Range を返す
「隣のセル」「一つ下のセル」「検索結果の右隣」など、“相対位置”を扱うときに真価を発揮する
基準セルを Range 変数に握っておき、Offset で動かすパターンを身につけると、汎用的なコードが書ける
