Menu

INDIRECT関数の使い方: 文字列をセル参照に変える

=INDIRECT("C"&E2)は、C列とE2の行番号から文字列として組み立てたアドレスのセルを読みます。セルに書いたシート名でシートを選ぶ、数値から範囲を作る、連動するプルダウンを作るときに使います。

このページのシートはすべて実際に動きます。数値や数式を変えると再計算されます。

=INDIRECT(E2)は、E2に文字列として書かれたアドレスのセルを読みます。E2にC4と書いてあれば、数式はC4の値を返します。アドレスは部品から組み立てることもできます。=INDIRECT("C"&E3)は、C列のE3の行番号のセルを読みます。

文字列で書いた参照
F2
ABCDEF
1ProductCategoryPriceAddressValue
2AppleFruit$1.20C4$0.80
3PearFruit$1.506$1.10
4CarrotVegetable$0.80
5BreadBakery$2.40
6MilkDairy$1.10
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

F2はC4、つまりCarrotの価格$0.80を読みます。E2をC3やB5に変えると、F2もそれに従います。F3は「C」とE3の6をつなげてアドレスC6を作り、$1.10を返します。E3を2にするとAppleの価格になります。

INDIRECT関数の構文

=INDIRECT(ref_text, [a1])
  • ref_text(参照文字列): 参照を表す文字列。"C4"、"B2:B6"、"Prices!A2"、"'Price list'!A2:B9"など。
  • a1(参照形式): A1形式のアドレスならTRUEか省略。FALSEにするとR1C1形式で読み、"R4C3"は4行3列目を意味します。行と列がどちらも数値のときに向いています。

文字列が正しいアドレスでないと、結果は#REF!になります。INDIRECTは本物の参照を返すので、SUM、COUNTIF、VLOOKUPなど、範囲を受け取るすべての関数の中で使えます。

数値から範囲を作る

アドレスは範囲全体でもかまいません。そこに数値をつなげると、大きさをセルで決める範囲になります。

最初のN行の合計
F2
ABCDEF
1MonthSalesRowsTotal
2Jan4,200312,900
3Feb3,900
4Mar4,800
5Apr5,100
6May4,600
7Jun5,300
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

E2が3だと文字列はB2:B4になり、F2はJanからMarまでを足して12,900になります。E2を6にすると半年分の27,900です。データが2行目から始まるので1+E2としています。同じ合計はINDIRECTを使わずに=SUM(B2:INDEX(B2:B7,E2))とも書け、こちらは揮発性ではありません。方法の比較はOFFSETのページにあります。

セルに書かれた名前のシートを参照する

シート名もセルから取れます。すると1つの集計用の数式が、シートをまたぐ検索になります。各行がA列に書かれた名前のシートを読みます。名前を単一引用符で囲んでおけば、スペースを含む名前でも動きます。

月別シートごとに1つの合計
B2
AB
1MonthTotal
2Jan12,500
3Feb12,200
4Mar13,700
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

B2は文字列'Jan'!B2:B4を組み立てて合計し、12,500になります。B3とB4は同じ数式を下にコピーしたものなので、Feb(12,200)とMar(13,700)を読みます。Febタブを開いて数値を変えると、集計も変わります。A2のJanをFebに書き換えると、B2はFebを合計します。引用符の中のB2:B4は文字列なので、数式を下にコピーしても変わりません。変わるのはA2の参照だけです。

連動するプルダウン(ドロップダウンリスト)

1つ目のプルダウンに応じて項目が変わる2つ目のプルダウンは、INDIRECTの定番の使い方です。Excelでのいつもの手順は次のとおりです:

  1. カテゴリーごとの項目を列にまとめ、各範囲にカテゴリー名を付けます。見出しを含めて列を選択し、数式 > 選択範囲から作成 > 上端行を使います。これで名前Fruit、Vegetable、Dairyができます。
  2. A2にカテゴリーのリストを設定します。データ > データの入力規則 > 入力値の種類: リスト、元の値はFruit,Vegetable,Dairyです。
  3. B2に、元の値が=INDIRECT(A2)のリストを設定します。A2がFruitなら、リストはFruitという名前の範囲を読みます。

下のシートでは、名前付き範囲の代わりにカテゴリーごとのシートを使って同じものを作っています。D2はINDIRECTを使ってA2に書かれた名前のシートの項目をスピルさせ、B2のリストはD2:D4を読みます。

カテゴリーに連動する項目のリスト
D2
ABCD
1CategoryItemItems for the category
2FruitAppleApple
3Pear
4Plum
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

A2でDairyを選ぶと、D2:D4がMilk、Butter、Cheeseに変わり、B2の選択肢も変わります。B2は新しく選ぶまで前の値のままです。Excelも同じ動きをするので、フォームでは項目の横に=COUNTIF(D2:D4,B2)>0のようなチェックを加えることがよくあります。Excel 365では名前付き範囲を使わずに、2つ目のリストをスピルする数式に向けることもできます。たとえば作業用のセルに=INDIRECT("'"&A2&"'!A2:A4")を入れ、元の値を=D2#にします。残りの設定はプルダウン(ドロップダウンリスト)のページにあります。

INDIRECTは揮発性で、挿入した行を無視する

INDIRECTは参照ではなく文字列を読むので、副作用が2つあります:

  • 変更のたびに再計算される。 文字列がどのセルを指すかExcelにはわからないので、ブックのどこかを編集するたびにすべてのINDIRECTを再計算します。数十個なら問題ありませんが、何万もあるとキーを押すたびに遅くなります。行番号を使ったINDEX(=INDEX(C:C,E3))は=INDIRECT("C"&E3)と同じ結果になり、入力が変わったときだけ再計算されます。
  • アドレスが動かない。 4行目より上に行を挿入すると=C4は=C5になりますが、=INDIRECT("C4")はC4を読み続け、そこは別の行になっています。シートに何があっても決まったセルにとどまる参照が欲しいなら、それが狙いどおりのこともあります。たいていは、誰かが行を挿入するのを待っているバグです。

別のブックへのINDIRECTは、そのブックが開いている間だけ動きます。閉じていると#REF!を返します。

練習: 行番号から価格を出す

価格表
F2
ABCDEF
1ProductCategoryPriceRowPrice
2AppleFruit$1.205
3PearFruit$1.50
4CarrotVegetable$0.80
5BreadBakery$2.40
6MilkDairy$1.10
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

やってみよう: F2で、INDIRECTを使ってE2に書かれた行番号のC列の価格を返してください。

よくある質問

ExcelのINDIRECTは何をしますか?

文字列を参照に変えます。=INDIRECT("C4")はC4の値を返し、=INDIRECT(E2)はE2に書かれたセルアドレスの値を返します。アドレスは&で組み立てられるので、=INDIRECT("C"&E2)はC列のE2の行番号のセルを読みます。

セルに書かれた名前の別シートを参照するには?

シート名を単一引用符で囲んでアドレスを組み立てます:=INDIRECT("'"&A2&"'!B2")。引用符があれば、スペースを含む名前でも動きます。=SUM(INDIRECT("'"&A2&"'!B2:B4"))はそのシートの範囲を合計します。

INDIRECTが#REF!を返すのはなぜですか?

文字列が正しいアドレスでないか、存在しないシートを指しているか、閉じている別のブックを指しているからです。INDIRECTを外して同じ式だけをセルに入れ、数式が組み立てる文字列を確かめてください。

INDIRECTは揮発性関数ですか?

そうです。文字列がどのセルを指すか前もってわからないので、Excelはブックのどこかが変わるたびにすべてのINDIRECTを再計算します。少しなら問題ありませんが、何千もあるとブックが遅くなります。多くの場合、INDEXなら揮発性にならずに同じことができます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める