和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セルやセル範囲を行数・列数分移動する - Offset

Rangeオブジェクトを指定行数、列数分移動する、
Offsetプロパティについて解説します。

基本構文

Rangeオブジェクト.Offset(移動行数, 移動列数)

サンプルコード

' 行・列を指定数移動する
Debug.Print Range("A1").Offset(1, 2).Address ' $C$2

' 行だけ移動する
Debug.Print Range("A1").Offset(1, 0).Address ' $A$2
    ' または
Debug.Print Range("A1").Offset(1).Address ' $A$2

' 列だけ移動する
Debug.Print Range("A1").Offset(0, 2).Address ' $C$1
    ' または
Debug.Print Range("A1").Offset(, 2).Address ' $C$1

' マイナス方向もOK
Debug.Print Range("C3").Offset(-1, -1).Address ' $B$2

' セル範囲ごと移動も可能
Debug.Print Range("B2:D3").Offset(2, 3).Address ' $E$4:$G$5

' 複数セルごと移動も可能
Debug.Print Range("A1,B2,C3").Offset(1, 1).Address ' $B$2,$C$3,$D$4

' 座標がA1より左上になってしまうと「アプリケーションまたはオブジェクト定義のエラー」
Debug.Print Range("A1").Offset(-1, -1).Address ' エラー

解説

Rangeオブジェクト.Offsetプロパティを実行すると、
Rangeオブジェクトを指定行数・列数移動したRangeオブジェクトを取得できます。

サンプルにある通り「セル範囲」や「複数セル」をまとめて移動することも可能です。


RangeオブジェクトからRangeオブジェクトを取得するプロパティですので、

Dim 移動元Range As Range
Set 移動元Range = Range("A1:C3")

Dim 移動先Range As Range
Set 移動先Range = 移動元Range.Offset(1, 1)

Debug.Print 移動元Range.Address ' $B$2:$D$4

このように移動元・移動先をそれぞれRange変数に入れることもできます。


移動数にはマイナスを指定することも可能ですが、
A1セルより左上に行こうとすると当然エラーになりますのでご注意ください。

結合セルの注意点

Offsetプロパティを結合セルから実行した場合は、
結合セルの次のセルを取得してしまう挙動になるため注意してください。

たとえばA1:C3の3×3正方形がセル結合されているとして、
Range("A1").Offset(1)は、結合下端の1つ下であるA4セルを取得してしまいます。

  • A1⇒A2ではなく、結合エリアの外であるA4まで行ってしまう
  • Offsetの特長である「元のRangeの大きさを維持」もできない

という2つの特殊な挙動になってしまいますので、
結合セルからのOffsetプロパティは実行しないようにしてください。


詳しくはこちらの記事をどうぞ。

www.limecode.jp

Offsetプロパティの使用例

表データから見出し行を削除する

表データから見出し行を削除する際は、
OffsetプロパティとResizeプロパティを組み合わせて実行します。

Set 対象データ範囲 = Worksheets("○○").AutoFilter.Range
Set 対象データ範囲 = 対象データ範囲.Offset(1)
Set 対象データ範囲 = 対象データ範囲.Resize(対象データ範囲.Rows.Count - 1)

対象データ範囲を「ひとつ下にずらして、行数をひとつ減らす」という処理ですね。

数値計算でよく出てくる「x = x + 1」と似たようなコードで、
「Set セル範囲 = セル範囲.Offset(1)」という記述でセル範囲を1つ下にずらせます。

この処理はよく行いますので覚えておきましょう。

ループ処理をOffsetで行う

普段やっている「行数のFor文」ですが、
Offsetプロパティを使ってこんな風に書き替えることも可能です。

Dim R As Long
For R = 1 To 100

    Cells(R, 1) = R

Next

' ↓書き替え

Dim i As Long
For i = 1 To 100
    
    Set 処理セル = 処理セル.Offset(1)
    
    処理セル.Value = i
    
Next

このコードでわざわざこの書き方をする必要はありませんが、
たまに便利な場面もありますので心の片隅に置いておいてください。