【VBAリファレンス|実務向け】セル参照を「絶対」にする!INDIRECT関数で数式を壊さない技術

スポンサーリンク

導入

Excelで数式を組む際、行の挿入や削除を行うと、意図せずセル参照がずれてしまい、エラーや誤った計算結果に悩まされたことはありませんか?特に「特定のシートの値を参照し続ける」という要件がある場合、通常のセル参照では対応しきれないことがあります。本稿では、シート構造の変化に左右されない「強固なセル参照」を実現するテクニックを解説します。

基礎知識

通常、Excelでセルを参照すると、その行や列が移動した際に数式内の参照先も自動的に追従して変化します。これは便利な機能ですが、固定されたマスターデータなどを参照している場合には仇となります。
ここで活用するのがINDIRECT関数です。この関数は「文字列」をセル参照として解釈させる性質を持っています。つまり、参照先を「直接指定」するのではなく「文字列として組み立てる」ことで、Excelの自動追従による参照ズレを防ぐことができます。

実装/解決策

参照先がSheet1のA列・B列であり、どの行にいてもその行のデータを正しく取得したい場合は、ROW関数を組み合わせます。ROW関数は「現在の行番号」を返すため、これと文字列を結合することで、「Sheet1のA列のn行目」という指示を数式として生成します。

数式の構造は以下のようになります:
=INDIRECT(“シート名!列記号” & ROW())

これにより、Sheet1でデータが行移動しても、数式側は「現在の行番号」を計算し直して常に正しい位置を参照し続けます。

サンプルプログラム

VBAで同様の処理を実装する場合、RangeオブジェクトのAddressプロパティを利用するよりも、INDIRECT関数のロジックを応用した方が柔軟なマクロを組むことができます。以下は、指定したシートの値を動的に取得する実用的なコード例です。

Sub Sample_IndirectLogic()
Dim i As Long
Dim targetSheet As String
targetSheet = “Sheet1”

‘ 1行目から10行目までループ処理
For i = 1 To 10
‘ INDIRECT関数のような仕組みをVBAで再現
‘ Cells(行, 列) を使うことで、シート構成変更の影響を受けにくくする
‘ ※通常の数式でのINDIRECT利用と同様の考え方です
Cells(i, 3).Value = Sheets(targetSheet).Cells(i, 1).Value & _
Sheets(targetSheet).Cells(i, 2).Value
Next i

MsgBox “データの結合が完了しました。”
End Sub

応用・注意点

INDIRECT関数は非常に強力ですが、「揮発性関数」であることを忘れてはいけません。シート上でこの関数を大量に使用すると、セルを編集するたびに再計算が走り、ブック全体の動作が重くなる原因となります。

実務で大量のデータを処理する場合、まずは以下の順で検討してください。
1. 通常のセル参照($記号での固定)で対応できないか検討する。
2. それでも解決しない場合にINDIRECT関数を採用する。
3. VBAで処理する場合は、Cellsプロパティを使用して動的に参照先を計算させるのが最も高速で安定します。

「便利だから」といって多用するのではなく、パフォーマンスとのバランスを見極めるのが、ベテランエンジニアへの第一歩です。

タイトルとURLをコピーしました