拙著『いちばんやさしいExcel VBAの教本』では、Chapter 10などでRangeオブジェクトを返すプロパティとして、
Range
ActiveCell
Cells
Range.End
Rows
Columns
Selection
をご紹介しています。
RangeオブジェクトのOffsetは実務でも出番の多いプロパティ
たくさん存在するRangeオブジェクトを返すプロパティの中で、Range・ActiveCell・Cells・Range.End・Rows・Columns・Selectionの次に、学習していただきたいのはRangeオブジェクトのOffsetプロパティです。
ActiveCell.Offset(1, 0).Select
End Sub
上記のSubプロシージャは実行すると、アクティブセルの1つ下のセルが選択されます。
「ActiveCell.Offset(1, 0)」で、アクティブセルの1つ下のセルを表すRangeオブジェクトを取得して、拙著でも何度も使っているRangeオブジェクトのSelectメソッドで選択しています。
繰り返し実行すれば、アクティブセルが1つずつ下に移動していきます。
このRangeオブジェクトのOffsetプロパティは、実務でも出番が多い便利なプロパティです。
.Offsetの前には必ずRangeオブジェクトを取得するコードが必要
Range.Offsetプロパティは、上位のオブジェクトを取得するコードを省略できるプロパティではありません。
Range.Endプロパティの場合「.End」の前にRangeオブジェクトを取得するコードを必要とするのと同様、「.Offset」の前にもRangeオブジェクトを取得するコードが書かれる必要があります。
Range.Offsetプロパティの引数について
RangeオブジェクトのOffsetプロパティには、元のRangeオブジェクト(上記Subプロシージャの場合ActiveCellプロパティで取得したアクティブセルを表すRangeオブジェクト)から、引数に指定された行・列だけずらしたRangeオブジェクトを返します。
第1引数には縦方向に何行ずらすか、
第2引数には横方向に何列ずらすかをそれぞれ指定します。
上記のSubプロシージャを
ActiveCell.Offset(2, 0).Select
に変更して実行した場合は、アクティブセルの2つ下のセルが選択されます。
また、
ActiveCell.Offset(0, 1).Select
に変更して実行した場合は、アクティブセルの1つ右のセルが、
ActiveCell.Offset(0, 2).Select
に変更して実行した場合は、アクティブセルの1つ右のセルが、選択されます。
更に、
ActiveCell.Offset(-1, 0).Select
に変更して実行した場合は、アクティブセルの1つ上のセルが、
ActiveCell.Offset(0, -1).Select
に変更して実行した場合は、アクティブセルの1つ左のセルが、選択されます。
引数を省略するのではなく0の指定をおすすめします
アクティブセルの1つ下のセルを取得するコードとして、
ActiveCell.Offset(1)
1つ右のセルを取得するコードとして、
ActiveCell.Offset(, 1)
が紹介されていることもあります。
これらは、それぞれ、
ActiveCell.Offset(1, 0)
と、
ActiveCell.Offset(0, 1)
の省略形です。
アクティブセルの1つ下のセルを取得する
ActiveCell.Offset(1, 0)
の第2引数を省略して
ActiveCell.Offset(1)
1つ右のセルを取得する
ActiveCell.Offset(0, 1)
の第1引数を省略して
ActiveCell.Offset(, 1)
と書くこともできます。
ですが、省略せずに「0」を書いておくほうが、理解しやすいと感じるはずです。
私は、引数を省略せず「0」を明記する書き方をおすすめします。
存在しないセルをRange.Offsetで取得しようとすると実行時エラーが発生
Range.Offsetの先にセルが存在しないような場合には、実行時エラーが発生します。
例えば、A1セルがアクティブな状態で、
ActiveCell.Offset(1, 0).Select
ActiveCell.Offset(0, 1).Select
は実行できますが、
ActiveCell.Offset(-1, 0).Select
ActiveCell.Offset(0, -1).Select
を実行した場合には実行時エラーが発生します。
A1セルの上や左にはセルが存在しないためです。
Range.Offsetはセル範囲でも使える
Range.Offsetプロパティは、1つのセルを表すRangeオブジェクトだけでなく、セル範囲を表すRangeオブジェクトでも使えます。
ActiveWindow.RangeSelection.Offset(1, 0).Select
End Sub Sub 選択範囲の移動_Selection()
If TypeName(Selection) <> "Range" Then Exit Sub
Selection.Offset(1, 0).Select
End Sub
WindowオブジェクトのRangeSelectionプロパティや、グローバルメンバーのSelectionプロパティを使った上記のようなSubプロシージャを実行すると、選択範囲が1行ずつ下にずれていきます。
これらも、先のActiveCell.Offsetと同様に、引数を変更して実行してみてください。
最終更新日時:2019-01-10 07:56
- Newer:FSO・FileSystemObjectでも_NewEnumは表示されない
- Older:Like演算子の否定は?
Home » いちばんやさしいExcel VBAの教本 » 次に学習すべきRangeを取得するプロパティはOffset