Excelのマクロを学習する中で、他の人が作ったVBAコードを見ると、
「Offset」という単語を見かけることがあるかと思います。
- 「Offset」っていったい何なの?
- 「Offset」を使ってできることを知りたい
- 「Offset」の使い方や書き方を知っておきたい
このような考えに至ったのではないでしょうか。
この記事を読むことで、下記のことがわかります。
- VBAの「Offset」について学べる
- 「Offset」の使い方・書き方を学べる
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
VBA(Excelマクロ)のOffsetとは?
「Offset」は、特定のセルから相対的な位置にある別のセルを参照するための機能です。
相対的とは、自分から見た位置関係を指します。
学校の教室を思い出してみてください。
あの子の席が、自分の席のナナメ前とか、2つ後ろとかのようなものでしょうか。
Excelのセルで言うと、C3セルが自分だとして、1行下の2列右がE4セルになります。
これが相対的です。

つまり、自分(例えばC3セル)から見た特定の位置のセル(ナナメ前とか2つ後ろなど)を参照する(見に行く)機能といったところでしょうか。
ではOffsetの使い方や活用例を見ていきましょう。
Offsetの使い方
「Offset」の基本構文は以下のとおりです。
' ▼基本構文
Offset(下へ移動する数, 右へ移動する数)
' ▼使用例
Offset(1, 2)
第一引数に「下へ移動する数」を、第二引数に「右へ移動する数」を指定します。
【引数とは?】
引数は「引き渡す数(引き渡す値)」のことで、Offsetの()内に渡す値を指します。
引数として「移動する数」を渡すと、「移動した先のセル」を私たちが受け取ります。
この受け取る値を「返り値(戻り値)」といいます。
例えば、魚屋さんにアジの3枚おろしを作ってもらいたい場合は、アジを渡して3枚おろしを受け取ります。
アジが引数、3枚おろしが返り値といったところでしょうか。
※左や上のセルを参照したい場合は、マイナス(-1など)を指定してください。
簡単な使い方
前提知識:マクロの基礎・作成から実行まで
前提知識:Debug.Printの表示方法
前提知識:Valueについて
まずは簡単な使い方を紹介いたします。
下記のVBAコードを見てください。
Sub オフセット()
Debug.Print Range("C3").Offset(1, 2).Value
End Sub
Offsetを使って、E4セルの値を表示した例です。
Offset(1, 2)となっているので、「1つ下」&「2つ右」のセルを参照します。

今回は「.Value」をつけているので、E4セルの値である「E4」がイミディエイトウィンドウに表示されます。

少し高度な使い方
前提知識:変数の宣言や使い方
前提知識:ループ処理(For)
前提知識:値の書き込み
下記VBAコードは、Offsetを使って連番を書き込みした例です。
Sub 連番を書き込み()
Dim i As Long
For i = 0 To 4
Range("A1").Offset(i, 0).Value = i + 1
Next i
End Sub
For文ループを使って参照位置をずらすという処理を繰り返しています。
(1周目は「0,0」なのでA1、2週目は「1,0」なのでA2・・・といった感じ)

実践的な活用例
実践で使える活用例を紹介いたします。
前提知識:Excelの最終行を取得
下記VBAコードは、元データの最終行に追記をした例です。
Sub 最終行に追記()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Cells(lastRow, 1).Offset(1, 0).Value = "新しいデータ"
End Sub
最終行から1つ下のセルを参照し、「新しいデータ」という値を書き込みしています。

OffsetとResizeの違い
よく似たものに「Resize」があります。
Resizeは、セルの参照範囲を変更するもので、Offsetとは違います。
Resize:セルの参照範囲を変更(A1:B2→A1:C3など)
Offset:セルの参照位置を移動(A1→C3など)
関連記事{Resizeの使い方と活用例}
ResizeとOffsetを連携することで、「ずらした範囲を拡大して参照する」ということも可能です。
下記のVBAコードを見てください。
Sub リサイズとオフセット()
Range("A1").Offset(1, 2).Resize(3, 4).Value = "連携"
End Sub
これで、A1セルから(下へ1、右へ2で)C2セルに移動し、C2~F4(3×4)の範囲に「連携」と書き込みされます。

うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBA(Excelマクロ)のOffsetについて解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!