【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で相対位置に値を入力する方法

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

    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を使い、ある範囲を基準にして別の範囲を扱う機会があれば、この記事を思い出してください!

    LINEで送る
    Pocket

    SEからWebエンジニアへ転職した理由

    侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

    SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

    弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

    「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
    更新日 : 2019年10月7日

    書いた人

    イシキ マコト

    イシキ マコト

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

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

    おすすめコンテンツ

    あなたにぴったりなプログラミング学習プランを無料で診断!

    プログラミング学習の効率を劇的に上げる学習メソッドを解説