【Excel】INDIRECT関数で参照先を文字列から組み立てる!Excelの動的参照の落とし穴と対策

【Excel】INDIRECT関数で参照先を文字列から組み立てる!Excelの動的参照の落とし穴と対策
🛡️ 超解決

Excelで参照先を動的に変更したい場面に遭遇したことはないでしょうか。例えば、シート名やセル番地が変化するたびに数式を修正するのは非効率です。INDIRECT関数を使えば、文字列として指定した参照先を実際のセル参照に変換できます。しかし、この便利な関数にも注意すべき落とし穴があります。この記事では、INDIRECT関数の基本的な使い方から、陥りやすい問題とその解決策までを解説します。

INDIRECT関数は、文字列をセル参照や範囲参照として評価する強力な機能です。これにより、数式が大幅に柔軟になり、参照先を外部のデータやユーザーの入力に基づいて変更することが可能になります。しかし、その柔軟性の裏には、数式の複雑化やパフォーマンス低下といったリスクも潜んでいます。これらのリスクを理解し、適切に対処することで、INDIRECT関数を最大限に活用できるようになります。

ADVERTISEMENT

INDIRECT関数とは何か?参照文字列をセル参照に変換する仕組み

INDIRECT関数は、引数に指定された文字列を、Excelが認識できるセル参照または範囲参照として評価し直す関数です。例えば、セルA1に「Sheet2!B5」という文字列が入力されている場合、INDIRECT(A1)とすると、Sheet2のB5セルを参照したことになります。これにより、数式内で直接セル番地やシート名を指定するのではなく、文字列として管理し、必要に応じてその文字列を変更することで、参照先を動的に切り替えることが可能になります。

この関数の最大のメリットは、参照先を固定せず、柔軟に変更できる点にあります。例えば、ユーザーが入力したシート名に基づいてデータを集計したり、連番のシート名を順番に参照してデータを処理したりする際に非常に役立ちます。数式を一つ一つ手動で修正する手間を省き、作業効率を大幅に向上させることができます。

お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

INDIRECT関数で参照先を文字列から組み立てる基本的な手順

INDIRECT関数は、主に以下の2つの引数で構成されます。最初の引数「参照文字列」は必須で、参照したいセルや範囲を文字列で指定します。2番目の引数「A1」は省略可能で、TRUEを指定するとA1形式(例: B2)、FALSEを指定するとR1C1形式(例: R2C2)で参照を解釈します。通常は省略してA1形式で問題ありません。

  1. INDIRECT関数の基本構文を理解する
    INDIRECT(参照文字列, [A1形式])。参照文字列には、セル番地、シート名、範囲名を文字列で指定します。
  2. セル参照を文字列で指定する
    例えば、セルB2を参照したい場合、「”B2″」のようにダブルクォーテーションで囲んで文字列として指定します。INDIRECT(“B2”)と入力すると、セルB2の値が取得できます。
  3. シート名を動的に指定する
    シート名がセルA1に入力されている場合、INDIRECT(A1&”!B2″)のようにシート名とセル番地を連結して指定します。これにより、A1セルのシート名が変われば、参照先も自動的に切り替わります。
  4. 範囲参照を文字列で指定する
    例えば、A1からC5までの範囲を参照したい場合、「”A1:C5″」のように指定します。INDIRECT(“A1:C5”)と入力すると、その範囲全体を参照できます。SUM関数などと組み合わせることで、動的な集計が可能になります。
  5. 名前定義と組み合わせる
    名前定義した範囲名を文字列としてINDIRECT関数に渡すことも可能です。例えば、「売上データ」という名前定義がある場合、INDIRECT(“売上データ”)でその範囲を参照できます。

INDIRECT関数利用時の落とし穴と具体的な対策

INDIRECT関数は非常に便利ですが、その利用にはいくつかの注意点と潜在的なリスクが伴います。これらの落とし穴を理解し、適切な対策を講じることが、Excelファイルの安定稼働とパフォーマンス維持のために不可欠です。

参照先が存在しない場合の#REF!エラー

INDIRECT関数で指定した参照先(シート名、セル番地、名前定義など)が存在しない場合、#REF!エラーが発生します。これは、INDIRECT関数が参照しようとした場所が実際には存在しないために起こるエラーです。

対策:

  1. 参照文字列の正確性を確認する
    シート名に誤字脱字がないか、セル番地が正しいか、名前定義が正確に行われているかを確認します。特に、シート名をコピー&ペーストする際は、余分なスペースが入っていないか注意が必要です。
  2. IFERROR関数と組み合わせる
    INDIRECT関数の結果をIFERROR関数で囲み、エラーが発生した場合に表示する代替値(例: 0や空文字列””)を指定します。これにより、#REF!エラーが画面に表示されるのを防ぎ、ファイル全体の表示をきれいに保てます。構文は「=IFERROR(INDIRECT(参照文字列), 表示したい値)」となります。
  3. 参照元の文字列を管理する
    参照文字列が入力されているセルや、名前定義の内容を定期的にチェックし、整合性が保たれているか確認する運用を確立します。

計算パフォーマンスの低下

INDIRECT関数は「揮発性関数」に分類されます。揮発性関数とは、ブック内のいずれかのセルが変更されるたびに再計算される関数です。INDIRECT関数は、その参照先を都度評価するため、ブック内に多数存在すると、Excelの再計算に時間がかかり、パフォーマンスが著しく低下する原因となります。

対策:

  1. INDIRECT関数の使用を最小限にする
    可能であれば、INDIRECT関数を使わずに済む代替手段(例: INDEX関数とMATCH関数、XLOOKUP関数など)を検討します。これらの関数は揮発性ではないため、パフォーマンスへの影響が少ないです。
  2. 参照文字列を直接入力する
    参照文字列をセルに入力するのではなく、数式内に直接、固定値として入力できる場合は、その方がパフォーマンスは向上します。ただし、動的な参照というINDIRECT関数のメリットは失われます。
  3. 参照範囲を限定する
    INDIRECT関数で参照する範囲をできるだけ小さくします。広範囲を参照するほど、再計算の負荷は増大します。
  4. 配列数式やPower Queryの活用
    大量のデータを動的に参照・集計する必要がある場合は、INDIRECT関数に頼るのではなく、配列数式やPower Queryなどのより効率的な機能の利用を検討します。Power Queryは、データの取得・整形・結合において、INDIRECT関数よりもはるかに高いパフォーマンスと柔軟性を提供します。
  5. 手動計算への切り替え
    Excelのオプションで計算方法を手動計算に設定し、必要なときだけ再計算(F9キー)を行うことで、一時的にパフォーマンスの低下を回避できます。ただし、これはあくまで一時的な回避策であり、根本的な解決にはなりません。

参照文字列の構築ミスによる意図しない結果

参照文字列の構築方法を誤ると、意図しないセルや範囲を参照してしまい、計算結果が食い違うことがあります。特に、シート名にスペースが含まれていたり、特殊文字が使われていたりする場合に、文字列の連結ミスが起こりやすいです。

対策:

  1. シート名の命名規則を統一する
    シート名には、スペースや特殊文字を避け、英数字のみで構成するなどの命名規則を設けます。これにより、文字列連結時のエラーを防ぎやすくなります。
  2. シート名を正確に取得する関数を使う
    シート名が頻繁に変更される場合は、GET.WORKBOOK(1)関数(マクロ関数)などを使用して、現在のシート名を動的に取得し、それをINDIRECT関数に渡す方法も考えられます。ただし、この関数は互換性やセキュリティ上の注意が必要です。
  3. 参照文字列を別のセルに表示して確認する
    INDIRECT関数に渡す参照文字列を、一時的に別のセルに表示させ、その文字列が正しいかを確認します。例えば、INDIRECT関数の引数部分をそのまま別のセルに入力し、表示される参照文字列が期待通りかを確認してから、元の数式に組み込みます。
  4. ADDRESS関数やCELL関数との併用
    ADDRESS関数を使えば、行番号と列番号からセル番地を文字列として生成できます。CELL関数を使えば、セルの情報(ファイル名、シート名、アドレスなど)を取得できます。これらの関数を組み合わせて、より正確な参照文字列を構築することが可能です。

ADVERTISEMENT

INDIRECT関数を避けるための代替手段

INDIRECT関数のパフォーマンスへの影響や#REF!エラーのリスクを回避するために、代替となる関数や機能の利用を検討することが重要です。特に、参照先が固定されている場合や、複雑な条件分岐が不要な場合には、よりシンプルな関数で代替できることが多いです。

INDEX関数とMATCH関数の組み合わせ

INDEX関数とMATCH関数の組み合わせは、INDIRECT関数がよく使われる「検索・参照」の場面で、揮発性関数を使わずに同様の機能を実現できる強力な代替手段です。MATCH関数で検索値の位置(オフセット)を特定し、INDEX関数でその位置にある値を返します。この組み合わせは、INDIRECT関数のように参照先を文字列で指定する必要がなく、直接的なセル参照を使用するため、パフォーマンスが低下しにくいという利点があります。

XLOOKUP関数(Microsoft 365/Excel 2021以降)

XLOOKUP関数は、VLOOKUP、HLOOKUP、INDEX/MATCHなどの検索・参照関数を統合し、より直感的で強力な機能を提供します。Microsoft 365やExcel 2021以降のバージョンで利用可能です。XLOOKUP関数は、検索範囲と戻り範囲を直接指定するため、INDIRECT関数のような揮発性関数によるパフォーマンス低下の懸念がありません。また、検索方向の指定や、一致しない場合の処理などを柔軟に設定できるため、INDIRECT関数よりも安全かつ効率的に同様の参照処理を行えます。

Power Query(Get & Transform Data)

大量のデータを複数のシートや外部ファイルから動的に取得・加工・集計したい場合、Power Queryが非常に有効です。Power Queryは、Excelの標準機能として搭載されており、GUI操作でデータの接続、整形、変換、結合を行えます。Power Queryで一度クエリを作成しておけば、データの更新時に自動的に最新の状態に反映されるため、INDIRECT関数を多数使用した複雑な数式よりも、管理しやすく、かつパフォーマンス面でも優れています。特に、参照するシート名やファイル名が規則的である場合、Power Queryでそれらを動的に読み込む設定が可能です。

まとめ

INDIRECT関数は、参照先を文字列から動的に組み立てる強力なツールですが、#REF!エラーやパフォーマンス低下といった落とし穴も存在します。これらのリスクを回避するためには、参照文字列の正確な管理、IFERROR関数との組み合わせ、そして可能であればINDEX/MATCH関数やXLOOKUP関数、Power Queryといった代替手段の活用が推奨されます。INDIRECT関数の特性を理解し、適切な場面で、適切な対策を講じながら活用することが、Excelファイルの安定性と効率性を高める鍵となります。

【要点】INDIRECT関数を安全に使いこなすためのポイント

  • INDIRECT関数: 文字列をセル参照に変換し、動的な参照を実現する。
  • #REF!エラー対策: 参照文字列の正確性を確認し、IFERROR関数でエラー表示を防ぐ。
  • パフォーマンス対策: 揮発性関数であるINDIRECT関数は多用せず、INDEX/MATCHやXLOOKUP、Power Queryへの代替を検討する。
  • 代替手段の活用: INDEX/MATCH関数やXLOOKUP関数、Power Queryは、INDIRECT関数よりも安全で効率的な場合が多い。
📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】