VBA・PYTHON・SQL コードの部屋 

EXCEL・ACCESS・VBA・PYTHON・SQLなどのCODE部屋

セルの移動(offset)

これだけはおさえるセル操作(1)-Offsetで自由自在

(Excel 97/2000/2002/2003/2007/2010/2013/2016)

セル(範囲)に関する基本事項で、RangeとCellsをマスターしたら、Offsetの使い方をぜひおさえてください。

【基礎編】

Offsetは簡単にいえば、セル(範囲)の移動です。使い方は次のとおりです。

    Rangeオブジェクト.Offset(行方向, 列方向)

例えば・・・

    ActiveCell.Offset(1, 0).Select

このコードはアクティブセルから行方向に1、つまり1つ下のセルを選択します。
また、移動しない方向については省略可能ですから・・・

    ActiveCell.Offset(1).Select

でも同じです。ただし、移動しない方向の0を省略すると可読性が下がるというデメリットがあるので、Offset(1)やOffset(, 1)と書くこともできることだけ覚えておき、省略しないで書く方がよいでしょう。

下方向へ1つ移動の指定がOffset(1, 0)であるならば、上方向へはどうするのでしょうか?
答えは素直に考えて、-(マイナス)表記にします。

    ActiveCell.Offset(-1, 0).Select

今度はActiveCellをSelectionに置き換えてみましょう。

    Selection.Offset(0, 2).Select

このコードは選択範囲を列方向に2、つまり右側へ2列選択範囲をずらします。
このとき、SelectionがセルA1からD5までのセル範囲をあらわしているとすれば、次のように書くことができます。

    Range("A1:D5").Offset(0, 2).Select

⇒ 実行するとセルC1からF5までのセル範囲を選択します。

【応用編】

基礎編でOffset(行方向,列方向)の指定の仕方がわかったら、今度はRangeの基本的な使い方と組み合わせてみます。
Rangeは、Range("A1") や Range("A1:D5")のような使い方のほかに

     Range(左上端, 右下端)
     ※左上端、右下端ともにセル、もしくはセル範囲

というように、引数として2つのセル、またはセル範囲を指定することでセル範囲をあらわすことができました。これをOffsetと組み合わせて使う方法を検討します。

次のコードはアクティブセルから右方向へ5列移動したセルまでのセル範囲を結合します。

    Range(ActiveCell, ActiveCell.Offset(0, 5)).Merge

アクティブセルがA1のときは、セルA1からF1までのセルを結合します。

次のコードは選択範囲を1行下まで拡張します。

    Range(Selection, Selection.Offset(1, 0)).Select

選択範囲がB5からE10までのセル範囲だったとすると、B5からE11までに拡張します。

例えばデータ入力シートに名前つきセル範囲があったとします。データ入力をするのですから当然範囲を拡張しなければならないケースが出てくるでしょう。
セル範囲につけられた名称が”データ”で、名前の範囲を5行拡張する場合・・・

    Range(Range("データ"), Range("データ").Offset(5, 0)).Name = "データ"

となります。
ただし、Rangeオブジェクトにはセル範囲のサイズを変更するResizeプロパティが用意されているので、セル範囲の拡張はResizeプロパティで行うこともできます。

ここまでの知識を応用すれば、さまざまなことができますが、さらにRnageオブジェクトのプロパティやメソッドなどをマスターすることにより、より高度なことを行うことができるようになります。
例えば、特定の値をFindメソッドで検索し、検索されたセルの右隣へ指定の値を書き込む、などということも可能となるのです。