INDITRECT関数は関数の解説を読んでも理解が難しいので、概念的な説明します。
表計算ソフトの基本的な機能のおさらい
関数の前に、初心者の方でない限り当たり前のExcel機能をおさらいさせてください。
A1セルには「セル内容」と打ち込んでいます。
B1セルには「=A1」と数式をセットします。
A | B | |
---|---|---|
1 | セル内容 | =A1 |
するとB1セルには、A1セルの値である「セル内容」が表示されます。
A | B | |
---|---|---|
1 | セル内容 | セル内容 |
この状態でA1セルを「変更結果」と変えると、B1セルも「変更結果」に変わります。
A | B | |
---|---|---|
1 | 変更結果 | 変更結果 |
当たり前の機能の説明ですが、ここで確認したいのは数式を使うことにより特定のセルの値が変わると他のセルの値も変わる、すなわちセルの値が動的に変わる、ということです。
参照するセル(範囲)を動的に変わるようにしたい
A2セルには「A1」と打ち込みます。
B2セルには「=A2」と数式をセットします。
A | B | |
---|---|---|
1 | セル内容 | セル内容 |
2 | A1 | =A2 |
ご存知の通り、B2セルにはA2セルの値である「A1」と表示されます。
A | B | |
---|---|---|
1 | セル内容 | セル内容 |
2 | A1 | A1 |
つまり、B2セルにはA2セルの値がセットされるのであり、="A1"という数式がセットされた結果と同じです。
しかし、A2セルで指定したセル(A1)の内容を表示する、つまり=A1という数式がセットされた結果と同じようにするにはどうすればいいのでしょうか。
この場合、B2セルに「=INDIRECT(A2)」と数式をセットします。
A | B | |
---|---|---|
1 | セル内容 | セル内容 |
2 | A1 | =INDIRECT(A2) |
B2セルにはA1セルの値である「セル内容」が表示されます。
A | B | |
---|---|---|
1 | セル内容 | セル内容 |
2 | A1 | セル内容 |
これによりA2セルで指定したセルの内容を表示されます。
これにより、A2セルに「C3」と打ち込みめば、B2セルにはC3セルの値が表示されます。
つまりINDIRECT関数は、セルの値でなく参照するセルを動的に変えたいときに使用します。
INDIRECT関数
本題の関数の説明に入ります。
= INDIRECT ( 参照文字列, [参照形式] )
「参照文字列」ですが、セルまたは範囲(複数セル)を表す文字列である必要があります。
「参照形式」は省略可能で、省略した場合は「TRUE」を指定したものとみなされます。「TRUE」はA1形式、「FALSE」はR1C1形式になります。
「参照文字列」が分かりにくいと思いますので、上記の設定から具体的に説明します。
- B2セルに「=INDIRECT("A2")」と数式をセットした場合です。「INDIRECT("A2")」において、文字列 "A2" はセルA2を表すので、B2セルに「=A2」と数式をセットしたことと同じです。そのため、「A1」と表示されます。
A B 1 セル内容 セル内容 2 A1 A1 - B2セルに「=INDIRECT(A2)」と数式をセットした場合です。
「A2」はセルA2の値を返すので、セルA2の戻り値である "A1" を値を取得すべきセルとみなします。
つまり「=INDIRECT(A2) 」は「=INDIRECT("A1")」であり、「=A1」となります。
そのため、セルB2に「=A1」と数式をセットしたことと同じこととなり、セルA1の値である「セル内容」と表示されます。A B 1 セル内容 セル内容 2 A1 セル内容
関数の使用例
参照するセルを動的に指定したいケースはアイデア次第でいろいろあるのですが、具体的に2つの例を挙げて説明します。
Excelでは他のブックやシートを参照することができます。
同一ブックの別シートを参照する場合、
= [シート名] ! [セル]
と指定します。例えば、「事務所」シートの「B6」セルを参照したい場合は、
- 「=事務所!B6」
を数式に指定します。
「事務所」、「店舗」、「住居」の3シートから合計件数を集約して表示するためには下図のように数式を設定すればOKです。
B | C | D | E | |
---|---|---|---|---|
4 | 事務所 | =事務所!B6 | =事務所!C6 | =事務所!D6 |
5 | 店舗 | =店舗!B6 | =店舗!C6 | =店舗!D6 |
6 | 住居 | =住居!B6 | =住居!C6 | =住居!D6 |
このケースでは3シートしかないのであまり手間ではないのですが、せっかくB列にシート名と同じ値があるのに、相対参照コピーを利用できないものか?と考えますよね。
account-it-dentist.hatenablog.com
シート名をINDITRECT関数によって動的に生成すれば、相対参照コピーによる設定が可能です。
C4セルには「=事務所!B6」と数式を設定したいので、「=INDITRECT(B4&"!B6")」と数式をセットします。同じ行にも同様にセットします。
C | D | E | |
---|---|---|---|
4 | =INDIRECT(B4&"!B6") | =INDIRECT(B4&"!C6") | =INDIRECT(B4&"!D6") |
5 | |||
6 |
あとはこの行を下の行に(相対参照)コピーすれば大丈夫です。
C | D | E | |
---|---|---|---|
4 | =INDIRECT(B4&"!B6") | =INDIRECT(B4&"!C6") | =INDIRECT(B4&"!D6") |
5 | =INDIRECT(B5&"!B6") | =INDIRECT(B5&"!C6") | =INDIRECT(B5&"!D6") |
6 | =INDIRECT(B6&"!B6") | =INDIRECT(B6&"!C6") | =INDIRECT(B6&"!D6") |
INDIRECT関数により個々のセルだけでなく範囲を指定することもできます。セル指定による範囲とともに名前(範囲名)をINDIRECT関数で動的に指定することもできます。
VLOOKUP関数は範囲を指定して利用する関数です。
account-it-dentist.hatenablog.com
例えば、店舗販売用と通信販売用の単価表を用意し、それぞれ「店舗販売」・「通信販売」という範囲名をつけます。そこで、「販売形態」、「商品」、「サイズ」から単価を求めるためにVLOOKUP関数を使用するケースを想定します。
VLOOKUP関数は、[検索値]、[範囲]、[列番号]、[検索方法] が引数です。
検索値は、商品を入力するセルを指定します。
列番号は、サイズを入力するセルからMATCH関数で取得できます。詳細は下記の記事をご覧ください。
account-it-dentist.hatenablog.com
そして範囲ですが、このケースではテーブルは2つあり販売形態により使い分けます。
このため、範囲は 「INDIRECT( [販売形態を入力するセル] )」 と名前(範囲名)を指定することにより、テーブルの切り替えを実現できます。
なお、この作業でもこの関数を使用しています。
account-it-dentist.hatenablog.com
ご質問は下の 「コメントを書く」 からお願いします。
ExcelやVBA全般に関わる質問で、比較的簡単にお答えできるものはできる限り回答したいと思います。
回答を公開でなくメールでやり取りしたいという場合は、その旨記載していただければ非公開で回答することも可能です。
有償での作業依頼は非公開にしますので、条件等をお知らせください。