top of page

​タグ一覧

配列処理(73)

階層化フォーム(33)

ファイル操作(27)

開発事例(20)

シート・セル操作(18)

コード自動生成(10)

ユーザーフォーム(9)

文字列操作(8)

図形操作(7)

設計思想(7)

開発効率化(6)

GAS(5)

アニメーション(5)

技術解説(4)

講座実施報告(5)

イミディエイトウィンドウ(4)

Googleスプレッドシート(4)

副業(4)

クリップボード(4)

条件付き書式(4)

その他(4)

ココナラ(3)

小説(3)

HTML(3)

JavaScript(3)

イベントプロシージャ(2)

Enum(2)

PDF(2)

フリーランス(2)

リスキリング(2)

数学(2)

Outlook(2)

介護(2)

Discord(2)

シフト表(2)

LookerStudio(2)

日報(2)

カレンダー(2)

罫線(2)

パズル(2)

小ネタ(2)

コード解説(2)

ステータスバー(1)

コード解析(1)

OneDrive(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

溶接ロボット(1)

保育士(1)

楽天市場(1)

経理(1)

医療(1)

文書作成(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

スーパー開発ショートカット(1)

ライブラリ処理(1)

放課後等デイサービス(1)

児童福祉支援(1)

学校(1)

UI(1)

CAD(1)

OffsetCell|Offsetの直感的取得 | Excel VBA

OffsetCell|Offsetの直感的取得 | Excel VBA

<概要 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 の出力だけで明確に確認できるようになっています。


<関連記事>

 今回紹介しているような汎用プロシージャを部品として一元管理する方法は別記事で紹介していますので、是非このノウハウも参考にしてみてください。

 コーディングを効率化する上でどんどん増やしていった汎用プロシージャ(部品)をいくら増やしても簡単に流用ができるような仕組みの構築が可能になります。


<コード>


Excel VBAによる業務自動化・ツール開発をご検討の方へ

​"脱Excel"の前に、現状のExcelの潜在能力を120%発揮してみませんか?

Softex-Celware

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2023 softex-celware。Wix.com で作成されました。

bottom of page