【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だけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

    • システムエンジニアという職業だけどコードが書けない
    • 事務作業が多くスキルがないため将来が不安
    • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
    という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

    弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

    既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

    まずは無料体験レッスンを予約する

    書いた人

    イシキ マコト

    イシキ マコト

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

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

    おすすめコンテンツ

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

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