OffsetCell|Offsetの直感的取得 | Excel VBA
- yuji fukami
- 1月14日
- 読了時間: 3分

<概要 VBAでのOffset処理>
OffsetCellは、Excel VBAにおけるRange.Offsetプロパティの「結合セルを含むと意図しないセルが返る」「直感と異なる位置になる」といった挙動を回避するための汎用プロシージャです。
基準セルのRow・Columnを直接用いてセル位置を計算することで、セル結合の有無に影響されず、常に意図した位置のセルを取得できます。
OffsetCellを使用することで、セル結合を考慮した例外処理や位置補正のコードを記述する必要がなくなり、安全かつ読みやすいコードを実装できます。
<実行例>
実行例のサンプルコードは次の通りです
実行サンプルの狙い
本サンプルは、結合セルを基準にした場合の Range.Offset の挙動が、見た目のセル位置と直感的に一致しないケースを確認するためのものです。
基準セルとして指定している B2 は、実際には B2:B3 の縦結合セルとなっており、見た目は1セルでも、VBA上では「複数セルを含むRange」として扱われます。
この状態で Range.Offset を使用すると、
「下方向に2行移動したつもり」
「基準セルを1セルとして扱ったつもり」
であっても、内部的なRangeのサイズが影響し、意図しないセルが返ることがある点が問題になります。
この挙動と、行番号・列番号を直接計算する OffsetCell との違いをImmediateウィンドウ上で一覧比較するのが本サンプルの目的です。
実行結果の説明
本サンプルを実行すると、次のようなシートが自動的に表示されます。

その次にイミディエイトウィンドウに以下の情報が出力されます。

まず注目すべき点は、基準セルが B2 であっても、結合範囲が B2:B3 として認識されている点です。
この状態で baseCell.Offset(2, 0) を実行すると、「B2を基準に2行下」という直感とは異なるセルが返る場合があります。
これは、Range.Offset が
「セル1つ分」ではなく
「Range全体(結合セルの高さ)」を基準に
移動量を計算するためです。
一方で OffsetCell(baseCell, 2, 0) は、
Cell.Row + RowOffset
Cell.Column + ColOffset
という形で、行番号・列番号のみを使ってセルを特定しています。
そのため、結合セルの有無やサイズに影響されることなく、常に「B2 を起点にした 2行下のセル」を安定して取得できます。
この結果から、
結合セルを含む帳票では Range.Offset は事故の原因になりやすい
位置指定が目的の場合は OffsetCell の方が安全で読みやすい
という点が、Debug.Print の出力だけで明確に確認できるようになっています。
<関連記事>
今回紹介しているような汎用プロシージャを部品として一元管理する方法は別記事で紹介していますので、是非このノウハウも参考にしてみてください。
コーディングを効率化する上でどんどん増やしていった汎用プロシージャ(部品)をいくら増やしても簡単に流用ができるような仕組みの構築が可能になります。

