【VBA入門】Offset(相対参照)を使ってセルや範囲を移動する方法

こんにちは。侍エンジニアブログTech編集部です!

ExcelVBAではRange.Offsetを使い、ある範囲を基準にして別の範囲を扱うことができます。この記事では、Range.Offsetの使い方について

  • Offsetとは
  • ActiveCell.Offsetでアクティブセルを動かす
  • Range.Offsetで指定したセルを動かす
  • Selection.Offsetで選択範囲を移動する方法

といった基本的な内容から

  • Rangeで指定した範囲をOffsetで変更する方法
  • Range.Resizeで指定した範囲をOffsetする方法
  • ValueとOffsetで相対位置に値を入力する方法

など応用的な使い方についても解説していきます。Range.Offsetは、汎用性が高くとても便利です。

今回は、その中でもよく使う例を挙げて解説していきます。

Offsetとは

オフセットとは、基準となるセルから移動する行と列を指定して相対的にセルを参照することです。

次の画像のようにセルB3からセルD6にオフセットするには、縦に3行、横に2列移動させます。
vba_offset11

セルD6からセルB3の逆方向ににオフセットするには縦に-3行、横に-2列移動させます。

ExcelVBAでは、ある範囲を基準にして別の範囲を扱うためにRangeオブジェクトのOffsetプロパティを使用します。

Rangeオブジェクト.Offset(行数、列数)

このコードでは、基準となる範囲をRangeオブジェクトのオブジェクトで指定しています。

また、オフセットする行数と列数をOffsetプロパティで指定しています。それではRange.Offsetの使い方について、次の章から例を交えつつ詳しく解説していきます。

ActiveCell.Offsetでアクティブセルを動かす

ActiveCell.Offsetでアクティブセルを動かすためには、次のようにします。

ActiveCell.Offset(動かす行数, 動かす列数).Activate

次のサンプルコードではアクティブセルを1行と2列、動かすためにActiveCell.Offset(1, 2).Activateとしています。

Sub Sample()
    ActiveCell.Offset(1, 2).Activate
End Sub
[実行前]

vba_offset21

[実行後]

vba_offset22

実行後の画像からアクティブセルが1行と2列、動いていることが確認できます。

このサンプルコードでは、Activateメソッドでアクティブセルをオフセットさせています。

Range.Offsetで指定したセルを動かす

先ほどはアクティブセルをオフセットする方法についてお伝えしました。

今度は指定したセルをオフセットする方法についてサンプルコードでみていきましょう。先ほどのActiveCellの代わりに、Rangeプロパティを使ってセルを指定します。

Sub Sample()
    Range("B2").Offset(1, 2).Activate
End Sub
[実行前]

vba_offset21

[実行後]

vba_offset22

Selection.Offsetで選択範囲を移動する方法

Selection.Offsetで選択範囲を移動するためには、次のようにします。

Selection.Offset(動かす行数, 動かす列数).Select

次のサンプルコードでは選択範囲を2行と3列、移動させるためにSelection.Offset(2, 3).Selectとしています。

Sub Sample()
    Selection.Offset(2, 3).Select
End Sub
[実行前]

vba_offset31

[実行後]

vba_offset32

実行後の画像から選択範囲が2行と3列、動いていることが確認できます。

このサンプルコードでは、Selectメソッドで選択範囲をオフセットさせています。

Rangeで指定した範囲をOffsetで変更する方法

Rangeで指定した範囲を選択するには、RangeオブジェクトのSelectメソッドを使用します。ここでは、Rangeで指定した範囲をSelectメソッドで選択した場合と、そこからOffsetで範囲を変更した場合を比較して解説します。

次のサンプルコードでは、Rangeで指定した範囲をSelectメソッドで選択しています。

Sub Sample()
    Range("A1:B2").Select
End Sub
[実行後]

vba_offset31

実行後の画像から、指定した範囲が選択されていることが確認できます。

次のサンプルコードでは、Rangeで指定した範囲をOffsetで変更しています。

Sub Sample()
    Range("A1:B2").Offset(2, 3).Select
End Sub
[実行後]

vba_offset32

実行後の画像から、単純に選択した場合と比較すると指定した範囲が変更されていることが確認できます。

Range.Resizeで指定した範囲をOffsetする方法

Range.Resize.Offsetプロパティは例えば今アクティブな単体セルから範囲に変更して、それをオフセットする場合に使います。

RangeオブジェクトのResizeプロパティでセルの範囲を変更した後で、Offsetプロパティで指定したセル間を移動します。

Sub Sample()
    Range("A1").Resize(6, 2).Offset(1, 5).Select
End Sub
[実行前]

Offset01

[実行後]

Offset02

実行前は”A1”セルがアクティブでしたが、Resizeプロパティで範囲を6行2列に変更しています。

それをOffsetプロパティで1行と5列移動して、"F2:G7"が選択されています。

ValueとOffsetで相対位置に値を入力する方法

ValueとOffsetで相対位置に値を入力するには、次のようにします。

Rangeオブジェクト.Offset(行数, 列数).Value = 入力する値

それでは、次のサンプルコードで実際に使い方を見てみましょう。

Sub Sample5()
    Dim rng As Range
    Set rng = Range("A1:B8")
    rng.Offset(0, 3).Value = rng.Value
End Sub
[実行前]

vba_offset41

[実行後]

vba_offset42

相対位置にある範囲の値を表すのがrng.Offset(0, 3).Valueです。

元の範囲の値であるrng.Valueを入力しているため相対位置に範囲の値がコピーされています。実行後の画像から、Offsetで指定した相対位置に範囲の値がコピーされていることが確認できます。

まとめ

いかがでしたか?

今回は、Range.Offsetの使い方について解説しました。

Range.Offsetでは、ある範囲を基準にして別の範囲を相対指定で扱うことができます。相対指定で扱うことで、シート上にある表の行番号や列番号を分かりやすく表現できます。

もし、Range.Offsetを使い、ある範囲を基準にして別の範囲を扱う機会があれば、この記事を思い出してください!

フリーランスのエンジニアです。
最近では、プログラミング関連の記事を作成するライターとしても活動しています。

趣味と業務の両方でプログラミング言語をいくつも学んできたので
その経験を活かして分かりやすい記事を作成できればと考えています。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI ENGINEER Plus

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら