次のセルを表すRangeオブジェクトを取得するRange.Nextプロパティについて記事を書きました。
単独セルの場合、Nextで取得できるRangeは、Offset(0, 1)で取得できるRangeと、同じ場合と異なる場合があります。
Range.NextとRange.Offset(0, 1)を確認するサンプルマクロ
新規に挿入したワークシートがアクティブな状態で以下のSubプロシージャを実行すると、メッセージボックスに「B1」が2回表示されます。
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プロシージャを実行してみてください。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)の違い