Home » Excel VBA Rangeオブジェクト » Offsetプロパティ » Range.NextとRange.Offset(0, 1)の違い

Range.NextとRange.Offset(0, 1)の違い

対象:Excel2010, Excel2013, Windows版Excel2016

次のセルを表すRangeオブジェクトを取得するRange.Nextプロパティについて記事を書きました。

単独セルの場合、Nextで取得できるRangeは、Offset(0, 1)で取得できるRangeと、同じ場合と異なる場合があります。

[スポンサードリンク]

Range.NextとRange.Offset(0, 1)を確認するサンプルマクロ

新規に挿入したワークシートがアクティブな状態で以下のSubプロシージャを実行すると、メッセージボックスに「B1」が2回表示されます。

Sub RangeのNextとOffsetを確認する()
 Dim rng As Range
 Set rng = Range("A1")

 MsgBox rng.Next.Address(False, False)
 MsgBox rng.Offset(0, 1).Address(False, False)
End Sub

A1セルを表すRangeの、NextとOffset(0, 1)で取得できるRangeは、いずれもB1セルを表します。

新規シートでシート保護を行うサンプルマクロ

つづいて以下のSubプロシージャを実行してから、先のSubプロシージャを実行してみてください。
Sub 新規シートを挿入しA1とC1だけ選択できるように()
 With Sheets.Add
  .Range("A1, C1").Locked = False
  .Protect
  .EnableSelection = xlUnlockedCells
 End With
End Sub

今度は
  MsgBox rng.Next.Address(False, False)
で「C1」が表示され、
 MsgBox rng.Offset(0, 1).Address(False, False)
で「B1」が表示されます。

このSubプロシージャでは、新規にワークシートを挿入して、
 With Sheets.Add

A1セルとC1セルのロックを外し、
  .Range("A1, C1").Locked = False

シートの保護を行い、
  .Protect
ロックされていないセルの選択だけができるようにしています。
  .EnableSelection = xlUnlockedCells

このようなワークシートの場合、Range.NextとRange.Offset(0, 1)は別のセルを表すRangeオブジェクトを返します。

Range.Nextは編集可能な次のセルを表すRangeを、Range.Offset(0, 1)は引数に指定されたとおり1列オフセットしたセルを表すRangeをそれぞれ取得します。

このような挙動ですから、Range.Offset(0, 1)で取得できない場合だけRange.Nextを使うほうが、可読性の面からイイだろうと私は考えています。

[スポンサードリンク]

Home » Excel VBA Rangeオブジェクト » Offsetプロパティ » Range.NextとRange.Offset(0, 1)の違い

「Offsetプロパティ」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.