メインコンテンツへスキップ
見出し画像

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実務ラボ|「なぜそうするか」の理由まで、丁寧に。

     
     
    実務ノウハウを発信しています。「なぜそうするか」の理由まで丁寧に解説。無料記事でExcelの基礎から、有料記事でVBAの実践的な設計思想まで。ITツールを使った業務効率化も発信中。

    あなたへのおすすめ