Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Offset

Excel VBA VBA
スポンサーリンク

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
VB

Range("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
VB

ws.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
VB

Offset(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 で動かすパターンを身につけると、汎用的なコードが書ける

VBAVBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました