Excel VBA | 「基準セルからの相対位置」を指定する(Offset プロパティ)

VBA
スポンサーリンク

Excel VBAのOffsetをやさしく理解する

「基準のセルから上下左右に何マス動いた先のセルを扱う」ための仕組みが Offset です。地図で“ここから右に2、下に1”と指示するのと同じ感覚で、セルを相対的に指定できます。


Offsetの考え方をかみ砕いて説明

  • 基準セル(出発点): まず最初に Range("B2") のように“今いる場所”を決めます。
  • 動く方向と距離: Offsetは「行(縦)」「列(横)」の移動量で指定します。
    • 行(RowOffset): 正の数は下へ、負の数は上へ。
    • 列(ColumnOffset): 正の数は右へ、負の数は左へ。
  • 返ってくるもの: 動いた先のセル(または範囲)そのもの。そこに「書く」「色をつける」などの操作をします。

覚え方: Offsetは「基準を動かす」のではなく「基準から見た位置を指さす」。元の基準はそのまま残ります。


まずは基本の例題(単一セル)

例1:基準から動いて値を書き込む

Sub Offset_Basic1()
    ' 基準:B2
    Range("B2").Offset(1, 2).Value = "ここに書く"  ' 1行下・2列右 → D3
End Sub
VB
  • 基準: B2
  • 移動: 下へ1、右へ2
  • 着地点: D3
  • 動作: “ここに書く”という文字を配置

例2:上と左に動いてセルを色付け

Sub Offset_Basic2()
    Dim target As Range
    Set target = Range("E5").Offset(-2, -1) ' 2行上・1列左 → D3
    target.Interior.Color = RGB(255, 200, 200) ' 薄い赤で塗る
End Sub
VB
  • ポイント: 負の数で「上/左」に動くことを体で覚える

例3:読みやすさ重視の書き方

Sub Offset_Basic3()
    Dim base As Range
    Dim rowMove As Long, colMove As Long
    Set base = Range("C3")
    rowMove = 0     ' 行はそのまま
    colMove = 3     ' 右に3列
    base.Offset(rowMove, colMove).Value = "右へ3つ"  ' F3
End Sub
VB
  • 狙い: 誤りが減る。後から見ても意図が分かる。

範囲(複数セルの塊)にも使える

Offsetは“サイズを保ったまま”範囲を丸ごと動かせます。

例4:2×3の範囲を動かして中身を消す

Sub Offset_RangeBlock()
    Dim block As Range
    Set block = Range("B2:D3")        ' 2行×3列
    block.Offset(1, 1).ClearContents  ' 1行下・1列右 → C3:E4 の中身を消す
End Sub
VB
  • 重要: 動かしても「2×3」の形はそのまま

例5:範囲の値をOffset先にコピー

Sub Offset_CopyBlock()
    Dim src As Range
    Set src = Range("A1:B2")
    src.Offset(3, 2).Value = src.Value ' C4:D5 に“値だけ”コピー
End Sub
VB
  • 豆知識: .Value は値のみ。書式もコピーしたいなら .Copy を使う。

ループでOffsetは本領発揮

“同じ動きを何行にも繰り返す”のが簡単になります。

例6:B2から下に10個の数字を並べる

Sub Offset_LoopDown()
    Dim i As Long
    For i = 0 To 9
        Range("B2").Offset(i, 0).Value = i + 1  ' B2〜B11 に1〜10
    Next i
End Sub
VB
  • 型: 「基準は固定、行Offsetだけを変える」

例7:C列から読み、隣のD列へ書く

Sub Offset_ReadWrite()
    Dim r As Long
    For r = 0 To 4
        Dim src As Range, dst As Range
        Set src = Range("C2").Offset(r, 0)  ' C2〜C6
        Set dst = src.Offset(0, 1)          ' 右隣(D2〜D6)
        dst.Value = "値: " & src.Value
    Next r
End Sub
VB
  • コツ: 読むセルを変えずに“相対的な隣”を使うとズレない

よくあるつまずきと回避策

  • 行・列の順序を逆にしがち:
    • 注意: Offsetは (RowOffset, ColumnOffset) の順。
    • 回避: 「行が先、列が後」と口に出して確認。
  • シートの外へはみ出す:
    • 例: 1行目でさらに上へ移動など。
    • 対策: 移動前に境界をチェック。
Dim base As Range, r As Long, c As Long
Set base = Range("A1"): r = -1: c = 0
If base.Row + r >= 1 And base.Column + c >= 1 Then
    base.Offset(r, c).Value = "OK"
End If
VB
  • “基準が動く”と誤解する:
    • 正しくは: Offsetは“新しい参照を返す”。基準はそのまま。
    • 対策: basetarget を別の変数に分ける。
  • RangeをSetし忘れる:
    • 症状: オブジェクト変数へ代入なのに Set を使わずエラー。
    • 対策: Set target = Range("A1").Offset(1,0) と書く。

手を動かして身につけるミニ練習(解答付き)

練習1:D4から“2行上・3列右”に「OK」

Sub Ex1()
    Range("D4").Offset(-2, 3).Value = "OK"  ' 着地点: G2
End Sub
VB

練習2:E5始まりの3×2範囲(E5:F7)を“1行下・1列左”へ色付け

Sub Ex2()
    Range("E5:F7").Offset(1, -1).Interior.Color = RGB(200, 230, 255) ' D6:E8
End Sub
VB

練習3:A2から下5行に“行番号つき”で書く

Sub Ex3()
    Dim i As Long, cell As Range
    For i = 0 To 4
        Set cell = Range("A2").Offset(i, 0)
        cell.Value = "Row " & cell.Row
    Next i
End Sub
VB

練習4:B2の値を“2行おき”にC列へ5回コピー(C2, C4, C6, C8, C10)

Sub Ex4()
    Dim k As Long
    For k = 0 To 4
        Range("C2").Offset(k * 2, 0).Value = Range("B2").Value
    Next k
End Sub
VB

使いどころの具体例

  • 表の“隣の列”に計算結果を書きたい: 基準セルから Offset(0, 1)
  • 見出しの下にデータを順番に埋めたい: 見出しセルを基準に Offset(i, 0) をループ。
  • 選択範囲の相対位置に処理したい: 選択中のセルなら Selection.Offset(...) を使う。

次の一歩

  • Cellsとの比較: Cells(行番号, 列番号) は絶対位置、Offset は相対位置。使い分けると自在に移動できます。
  • FindやEndと併用: 最終行を見つけてから Offset(1,0) で次の空き行へ、など実務で即使えます。
  • 自分のシートで試す: どの列を基準に何行処理したいか、具体的な作業内容を教えてくれたら、その場でピッタリのコードを作ります。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました