
ExcelでINDIRECT関数を乱用してはいけない理由――ファイルを重くする揮発性関数の代替策
シート名を可変にしたり、セル参照を文字列で組み立てるためにINDIRECTがよく使われます:
=INDIRECT("Sheet"&A2&"!B3")「シート名が変わっても対応できる便利な数式」として重宝されますが、多用すると問題が起きます。
INDIRECT関数が引き起こす3つの問題
問題① 揮発性関数でファイル全体が遅くなる
INDIRECTはOFFSETと同じ「揮発性関数」です。
揮発性関数が含まれるシートでは、他のセルが変更されるたびにINDIRECTの数式がすべて再計算されます。100個のINDIRECTがあれば、Enterを押すたびに100回再計算が走ります。シートの応答が遅くなる原因になります。
問題② 参照先をリネームされると壊れる
通常の `=Sheet1!B3` という参照は、シート名を変更するとExcelが自動で `=新しい名前!B3` に更新します。
INDIRECTは文字列でシート名を組み立てるため、シート名が変わってもExcelは参照先を更新しません。シート名変更 = 数式が壊れて#REF!になる、という状態になります。
問題③ どこを参照しているか静的に読めない
`=Sheet1!B3` は数式を見れば参照先がわかります。
`=INDIRECT("Sheet"&A2&"!B3")` は実行してみるまで何を参照しているかわかりません。別の人がファイルを引き継いだとき、数式の動作を理解するのに時間がかかります。
解決策:INDIRECTを使わない構造に変える
複数シートの集計 → 3D参照を使う
=SUM(Sheet1:Sheet12!B3)Sheet1からSheet12まで全シートのB3を合計できます。INDIRECTなしで複数シートをまとめられます。
「シート名をセルで指定したい」 → データを1シートに集約する
複数シートに分散したデータを1枚のシートに縦持ちで集約(Power Queryで取り込み)すれば、INDIRECT自体が不要になります。
「月ごとにシートを分けている」構造がINDIRECTを必要とする主な原因です。月を列として持つ1枚のシートに変換することで、SUMIF・ピボットテーブルで直接集計できます。
まとめ
| 状況 | INDIRECT | 代替手法 |
|------|---------|--------|
| 複数シートを集計 | 揮発性・シート名変更で壊れる | 3D参照 |
| シート名を可変にしたい | 同上 | データを1シートに集約 |
INDIRECTが必要に見える構造は、多くの場合「データが複数シートに分散している」設計上の問題です。INDIRECTで対応するより、データ構造を見直すほうが根本解決になります。
もしこの記事が役に立ったら、スキ♡をポチっとしていただけると励みになります。
フォローしていただくと、同じような実務直結のExcel記事をお届けします。
IT実務ラボ|「なぜそうするか」の理由まで、丁寧に。