Home » いちばんやさしいExcel VBAの教本 » 次に学習すべきRangeを取得するプロパティはOffset

次に学習すべきRangeを取得するプロパティはOffset

動作検証バージョン:Windows版Excel(バージョン1811 ビルド11029.20108)

次に学習すべきRangeを取得するプロパティはOffset

拙著『いちばんやさしい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プロパティです。

Range.Offsetがどのようなプロパティかは、以下のSubプロシージャを実行すると見えてきます。
Sub 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オブジェクトでも使えます。

Sub 選択範囲の移動_Window_RangeSelection()
 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

[スポンサードリンク]

Home » いちばんやさしいExcel VBAの教本 » 次に学習すべきRangeを取得するプロパティはOffset

「いちばんやさしいExcel VBAの教本」の記事一覧

検索


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

.