PR

ExcelのINDIRECT関数が重い原因と対策|INDEXなどへの置き換え方法

Excel
記事内に広告が含まれています。

Excelでセルを1つ変更しただけなのに、しばらく「計算中」と表示される。
数式をコピーしたりデータを入力したりするたびに、Excelの反応が遅くなる。

そのブックでINDIRECT関数を大量に使用している場合、再計算の仕組みが重さの原因になっている可能性があります。

INDIRECT関数は、文字列からセル参照を作れる便利な関数です。

一方、Microsoft LearnではINDIRECT関数は再計算のたびに計算される「揮発性関数」に含まれ、さらにシングルスレッドで計算される関数として説明されています。

数個使用しただけで必ずExcelが遅くなるわけではありません。

しかし、

・数千~数万セルへコピーしている
・INDIRECTを複雑な数式の中で使用している
・大きな範囲を何度も計算している
・複数シートや外部ファイルを大量に参照している

といった条件が重なると、再計算に時間がかかりやすくなります。

この記事では、INDIRECT関数が重くなりやすい理由から、原因の切り分け方、直接参照・XLOOKUP・INDEX・CHOOSEなどへ置き換える方法まで、Windows版Microsoft 365 Excelで作成した検証ブックを使って解説します。

INDIRECT関数が重くなりやすい2つの理由

INDIRECT関数を1000行へ入力したExcel検証画面

INDIRECT関数は、

=INDIRECT("B2")

のように、文字列として指定した「B2」を実際のセル参照へ変換する関数です。

たとえばセルへ入力したシート名や列名によって参照先を変更できるため、複数シートから値を取得する帳票などで便利に使えます。

しかし、大量に使用するとExcelが重くなる場合があります。

主な理由は次の2つです。

INDIRECTは再計算されやすい揮発性関数

Excelには、変更されたセルと関係のある数式を中心に計算する仕組みがあります。

一方、INDIRECTは揮発性関数です。

Microsoft LearnでもINDIRECTは揮発性関数に分類されており、Excelが再計算するときに再度計算されます。

そのため、INDIRECTを数千セルへコピーしているブックでは、再計算する数式が増え、入力や編集後の待ち時間が長くなることがあります。

INDIRECTはシングルスレッドで計算される

もう1つの特徴が、INDIRECTはシングルスレッドで計算される関数であることです。

現在のExcelは複数のCPUコアを使って数式を並列計算できますが、Microsoft LearnではINDIRECTはシングルスレッドで計算される関数として挙げられています。

そのため、高性能なパソコンを使用していても、大量のINDIRECTが計算処理のボトルネックになることがあります。

ただし、
「INDIRECTを使っている=必ずExcelが重くなる」
わけではありません。
重さは数式の個数や参照範囲、ほかの数式、データ量などにも左右されます。

まずは次のような状態になっていないか確認してみましょう。

確認項目重くなりやすい状態改善の方向
数式の個数数千~数万セルへコピー必要な行だけに減らす
再計算入力するたびに長時間待つ揮発性関数を減らす
参照範囲不要に大きな範囲を計算実際に必要な範囲へ限定
数式の構造INDIRECTを何重にも使用補助列などへ分ける
シート参照多数のシート名を文字列で生成データ構造自体を見直す
外部参照別ブック名をINDIRECTで生成直接リンクやPower Queryを検討

INDIRECTの主な置き換え方法

INDIRECTを見つけても、すべて同じ関数へ置き換えればよいわけではありません。
「なぜINDIRECTを使っているのか」によって、適した方法が変わります。

目安としては、次のように考えると分かりやすいです。

INDIRECTを使っている目的主な置き換え候補
固定されたセル・範囲を参照直接参照
見出しによって列を変更XLOOKUP / INDEX+MATCH
行番号・列番号から値を取得INDEX
可変範囲を作成INDEX / Excelテーブル
少数のシートを切り替えCHOOSE
月別シートなどが増え続ける1つのテーブルへ統合
複数CSV・ファイルをまとめるPower Query

まずはINDIRECTが何のために使われているのか確認し、同じ結果をより単純な方法で作れないか考えてみましょう。

まずINDIRECTが原因か切り分ける

Excelが重い原因はINDIRECTだけではありません。
大量の数式や条件付き書式、画像、外部接続、アドインなどが原因になることもあります。

そのため、いきなりすべてのINDIRECTを書き換えるのではなく、元ファイルをコピーして一部の数式から確認するのがおすすめです。

■INDIRECTが使われている場所を確認する方法
1. 元のExcelファイルを別名で保存します。
 ↓
2. [ホーム]→[検索と選択]→[検索]をクリックします。
 ↓
3. [オプション]を開き、[検索場所]を[ブック]、[検索対象]を[数式]にします。
 ↓
4. [検索する文字列]へ「INDIRECT」と入力します。
 ↓
5. [すべて検索]をクリックし、INDIRECTを使用しているセルの一覧と件数を確認します。

検索と置換を選択している画面
検索と置換からINDIRECTを検索している画面

INDIRECTが100個、1,000個見つかったとしても、それだけで重さの原因とは断定できません。
重要なのは、INDIRECTを減らしたときに実際の操作が改善するかを確認することです。

今回の検証ブックでは、1,000行のINDIRECT版と置き換え後の数式を同じデータで作成しました。

ただし、パソコンの性能やExcelブックの構成によって計算時間は変わるため、
「INDIRECTを1,000個使うと○秒遅くなる」
とは断定できません。

この記事では、同じ結果を保ったまま、INDIRECTを使わない数式へ変更できるかを中心に確認していきます。

固定参照ならINDIRECTを直接参照へ変更する

もっとも簡単に改善できるのが、そもそもINDIRECTを使用する必要がないケースです。

たとえば、

=INDIRECT("B2")

という数式があり、今後も参照先がB2のままなのであれば、

=B2

で同じ値を取得できます。

同様に、

=SUM(INDIRECT("B2:B100"))

についても、B2:B100から変更する必要がなければ、

=SUM(B2:B100)

で問題ありません。

わざわざ文字列から参照を作成する必要がないため、固定されたセルや範囲を参照しているINDIRECTは、直接参照へ変更するのが第一候補です。

直接参照には、数式を確認したときに参照先が分かりやすいというメリットもあります。

また、通常のセル参照であれば行や列を挿入したときにExcelが参照を調整しますが、INDIRECT内の文字列は通常の参照と同じようには変更されません。

そのため、表の構成を変更した結果、INDIRECTでは意図していないセルを参照してしまうケースにも注意が必要です。

列の切り替えはXLOOKUPやINDEXへ置き換える

INDIRECTは、「セルへ入力した文字によって参照する列を変更する」といった使い方でもよく利用されます。
たとえば、F2へ列名を入力し、その内容によって「売上」「原価」「数量」を切り替えるケースを考えてみましょう。

INDIRECTでは、列記号をF2へ入力して、

=INDIRECT($F$2&ROW())

のような数式を作れます。

INDIRECTでデータを取得している画面

便利ですが、Microsoft 365を使用しているのであれば、見出し名を使ってXLOOKUPへ置き換えることもできます。

Microsoft 365ならXLOOKUPで置き換える

B1:D1に、

・売上
・原価
・数量

という見出しがあり、F2へ「売上」と入力するとします。

この場合は、

=XLOOKUP($F$2,$B$1:$D$1,B2:D2)

と入力します。

XLOOKUPでデータを取得している画面

XLOOKUPがF2と同じ見出しを探し、その列にある同じ行の値を返します。
Microsoft Supportでも、XLOOKUPは検索範囲から値を探し、対応する範囲の値を返す関数として説明されています。

列記号の「B」「C」「D」を指定するより、
「売上」「原価」「数量」と実際の項目名で選択できるため、数式の意味も分かりやすくなります。

INDEX+MATCHへ置き換える方法

XLOOKUPを使わず、INDEXとMATCHを組み合わせることもできます。

たとえば、

=INDEX($B$2:$D$1001,ROW()-1,MATCH($F$2,$B$1:$D$1,0))

と入力します。
MATCH関数でF2と同じ見出しが何列目にあるかを調べ、INDEX関数で同じ行の値を取得します。

INDEXとMATCHでデータを取得している画面

Microsoft Learnでは、INDEXは揮発性関数ではないと説明されています。

ただし、
INDIRECTをXLOOKUPやINDEXへ変更すれば必ず高速になるわけではありません。
巨大な範囲を参照していたり、ほかに重い数式が大量に残っていたりすれば、改善を感じられない場合があります。

置き換え後は、

・先頭行
・中央付近
・最終行
・空白セル
・エラーが発生する条件

などを確認し、元の数式と同じ結果になるかチェックしてください。

可変範囲はINDEXやExcelテーブルへ置き換える

INDIRECTは、データ件数によって集計範囲を変更する目的でも使われます。

たとえば、E1へ「100」と入力されていて、B2:B100を合計したい場合、

=SUM(INDIRECT("B2:B"&E1))

のような数式を作れます。

しかし、E1に最終行番号が入っているのであれば、

=SUM(B2:INDEX(B:B,E1))

のようにINDEXを使って範囲を作ることもできます。

INDIRECTとINDEXの比較画面

Microsoft Learnでも、動的範囲を作成する方法としてINDEXを使用する例が紹介されており、INDIRECTは揮発性かつシングルスレッドで計算される点が説明されています。

データが継続的に追加される表なら、Excelのテーブル機能を使う方法もあります。
テーブルに変換しておけば、新しいデータを追加したときに対象範囲も自動的に拡張されます。

そのため、
「データが増えるたびにINDIRECTで最終行を変更する」
という設計自体が不要になる場合があります。

👉可変範囲を作る方法にはOFFSET関数もあります。
INDEXとの違いや、OFFSETで範囲を動的に変更する方法については以下の記事で詳しく解説しています。

シート名を切り替えるならCHOOSEも検討する

INDIRECTには、

=INDIRECT("'"&A1&"'!B2")

のように、セルへ入力した文字列をシート名として使用できるメリットがあります。

たとえばA1へ、

・東京
・大阪
・愛知

のいずれかを入力し、それぞれのシートにあるB2を取得するケースです。

INDIRECTで別シートの値を参照している画面

候補となるシートが少なく、今後も大きく増えないのであれば、CHOOSEとMATCHを組み合わせる方法があります。

=CHOOSE(MATCH(A1,{"東京","大阪","愛知"},0),東京!B2,大阪!B2,愛知!B2)

A1が「東京」なら東京シートのB2、「大阪」なら大阪シートのB2を返します。

CHOOSEで別シートの値を参照している画面

Microsoft Learnでも、揮発性関数を減らす方法として、INDIRECTの代わりにCHOOSEを利用する方法が紹介されています。

ただし、この方法はシート数が少ない場合に向いています。
「1月」「2月」「3月」……と毎月新しいシートが増えたり、数十種類のシートを切り替えたりする場合、CHOOSEへ変更すると数式が複雑になります。

その場合は、関数だけを置き換えるのではなく、データの持ち方自体を見直してみましょう。

シートが増え続けるならデータ構造を見直す

たとえば、

・2026年1月
・2026年2月
・2026年3月
・2026年4月

のように月ごとのシートを作り、

=INDIRECT("'"&A1&"'!B2")

でシートを切り替えているケースがあります。

数シート程度なら便利ですが、毎月シートが増え続ける場合は数式も管理しにくくなります。

その場合は、

年月商品売上
2026/01商品A100,000
2026/02商品A120,000
2026/03商品A110,000

のように、1つの明細テーブルへ年月列を追加する方法も検討してみてください。
データを1つにまとめれば、SUMIFSやピボットテーブルなどで年月を条件に集計できます。

Microsoft Learnでも、多数のテーブルを切り替える方法の代替として、各テーブルを識別する列を追加し、1つの大きなテーブルへ統合する方法が紹介されています。

複数のCSVファイルやExcelファイルからデータを取り込んでいる場合は、Power Queryを使って自動的に結合する方法もあります。

つまり、INDIRECTの改善では、
「どの関数へ置き換えるか」だけでなく、「なぜ文字列から参照を作る必要があるのか」
まで考えることが重要です。

👉月ごとに増えるCSVをINDIRECTなどの数式で参照するのではなく、Power Queryで1つの表へまとめる方法もあります。
フォルダ内のCSVを一括結合する手順は、以下の記事で詳しく解説しています。

参照範囲と重複計算も減らす

INDIRECTを削除しても、ほかの数式が大量のデータを何度も計算していればExcelの重さが残る場合があります。

特に注意したいのが、

・必要以上に大きな配列を計算している
・同じ検索処理を複数セルで繰り返している
・1つのセルへ巨大な数式を詰め込んでいる

といったケースです。

たとえば同じMATCH関数を10列で繰り返しているのであれば、MATCHで求めた位置を補助セルへ一度保存し、その値をほかの数式から参照する方法があります。

また、Microsoft Learnでは、配列数式などで使用する範囲を必要以上に大きくしないことや、巨大な数式を補助列などへ分けることもパフォーマンス改善策として紹介されています。

なお、列全体参照を使っただけで必ず遅くなるわけではありません。

Microsoft Learnでは、SUM・SUMIF・SUMIFSなどについて、未使用セルは検査されないため列全体参照でも比較的効率的に処理できると説明されています。

重要なのは、関数の種類や計算方法を考えず、必要以上のデータを何度も処理していないか確認することです。

手動計算への変更は一時的な対処にする

Excelが重い場合、
・[数式]→[計算方法の設定]→[手動]
へ変更すると、セルへ入力するたびに自動計算されるのを止められます。
大きなブックの数式を修正するときには便利ですが、根本的な解決方法ではありません。

手動計算のまま作業すると、数式が更新されていない古い値を見て判断してしまう可能性があります。
修正作業中だけ手動計算を使用する場合は、必要に応じて[F9]キーで再計算してください。

また、作業終了後は、
・[数式]→[計算方法の設定]→[自動]
へ戻っていることを確認してください。
Excelの計算モードは、同時に開いているほかのブックにも影響する場合があります。

そのため、
「重いから手動計算にして終わり」ではなく、INDIRECTや数式構造を見直すまでの一時的な対処
として使用するのがおすすめです。

👉手動計算のままになり、「値を変更しても数式が更新されない」という場合は、以下の記事で計算方法の設定やF9による再計算について詳しく解説しています。

👉VBAで大量のセルを書き換えているときに再計算が原因で処理が遅い場合は、Application.Calculationを使って計算方法を制御する方法もあります。

INDIRECTが重いときによくある疑問

Q1.INDIRECTを1個使うだけでもExcelは遅くなりますか?

INDIRECTを数個使用しただけで、必ず遅くなるわけではありません。
問題になりやすいのは、
・数千~数万セルへコピーしている
・ほかの複雑な数式と組み合わせている
・大量の依存関係がある
・大きな範囲を繰り返し計算している
といった条件が重なった場合です。

使用している個数だけで判断せず、コピーしたブックで一部を置き換えて動作を比較してください。

Q2.INDEXやXLOOKUPへ変えれば必ず速くなりますか?

必ず速くなるとは限りません。
INDEXはINDIRECTのような揮発性関数ではありませんが、参照範囲やほかの数式、データ量なども計算速度へ影響します。
XLOOKUPについても、置き換えただけで必ず高速になると断定することはできません。

数式を変更したら、同じデータ・同じ操作で変更前後を比較することが重要です。

Q3.INDIRECTで閉じた別ブックを参照できますか?

基本的にはできません。
Microsoft Supportでは、INDIRECTで外部ブックを参照する場合、参照元のブックを開いておく必要があり、閉じていると#REF!エラーになると説明されています。

外部ファイルを継続的に参照する仕組みでINDIRECTを使用している場合は、通常の外部参照やPower Queryなどへの変更も検討してみてください。

Q4.INDIRECT関数は使わない方がいいですか?

いいえ。
INDIRECTは、セルへ入力された文字列から参照先を動的に変更したい場合に便利な関数です。
使用数が少なく、計算速度にも問題がなければ、無理に削除する必要はありません。

問題になりやすいのは、
「便利だから」という理由でINDIRECTを大量のセルへコピーし、本来は直接参照や別の関数で作れる部分まで使用しているケース
です。

INDIRECTを完全になくすことを目的にするのではなく、
「本当にINDIRECTでなければ実現できないのか」
を確認してみましょう。

まとめ

INDIRECT関数が重くなりやすい主な理由は、再計算のたびに計算される揮発性関数であり、シングルスレッドで計算される関数だからです。

ただし、Excelが重いからといって、INDIRECTだけが原因とは限りません。

まずはINDIRECTを使用しているセルを検索し、

・使用している数式の数
・参照している範囲
・重複している計算
・シートや外部ファイルの参照方法

などを確認してみましょう。

置き換える場合は、INDIRECTを使用している目的によって方法が変わります。

使用目的改善方法
固定セル・固定範囲直接参照
見出しによる列切り替えXLOOKUP / INDEX+MATCH
可変範囲INDEX / Excelテーブル
少数のシート切り替えCHOOSE
増え続ける月別シート1つのテーブルへ統合
複数CSV・ファイルPower Query

最初からすべてを書き換えるのではなく、元ファイルをコピーして一部の数式から変更し、結果と動作を確認しながら進めるのが安全です。

INDIRECTは便利な関数なので、使うこと自体が悪いわけではありません。

大量に使用してExcelが重くなっている場合は、関数を単純に交換するだけでなく、参照方法やデータ構造そのものを見直すことが、根本的な改善につながります。

👉INDIRECTを見直してもExcel全体が「応答なし」になる場合は、数式以外が原因になっている可能性もあります。
保存前の判断方法や原因別の対処法は、以下の記事で詳しく解説しています。

ろじゃー

仕事・子育てに奮闘中の社会人です。
仕事でも日常生活でも、ちょっとでも便利になることが紹介できるブログを書いています!
 
仕事柄、PC操作やエクセル、VBAなどは得意です!
Excel歴は10年以上の事務職。
関数やVBAを活用して、資料作成やデータ分析をはじめとした様々な業務の効率化・自動化に取り組んできました。
 
このブログでは、実際の業務で使える効率化テクニックを発信しています。
「わからない」や「困った」など問題を抱える方や、もっと効率化したいと思っている方に、少しでも役立てれば幸いです!

ご質問・ご相談など、お気軽にご連絡ください。

🥷 「現代で暮らすゆる忍者」ラインスタンプシリーズ公開中!日常や仕事、夫婦の会話など様々なシーンを製作しています
▶ LINEスタンプ一覧はこちら

ろじゃーをフォローする
ご質問・ご相談はこちらへ!
 ろじゃー|日々、ちょっとずつ良くなることを目指すブロガー
Excel歴10年以上。VBAや関数、業務効率化などを発信中。
📩 お問い合わせはこちら
Excel
シェアする
ろじゃーをフォローする

コメント

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