Excelシートにデータを入力するとき、プルダウンリスト(ドロップダウンリスト)で選択肢の中から選んで入力できると便利ですし、集計時もデータがバラつかず効率的です。
このブログ記事でも「Excel ドロップダウンリスト」記事など何度か話題に上げました。

このプルダウンリストは、[データ]-[データツール]-[データの入力規則]で「設定」タブの「入力値の種類」を「リスト」にし、「元の値」欄にリストとする値を列記して設定しますね。(下図)

 

この「元の値」には、値を「,」で区切って入力するか、シート上に列記されたセル範囲を指定するなどして設定します。

ところで、下図の表データについて VLOOKUP関数である費目の合計金額を求めることを例に考えてみましょう。

 

表データはテーブルとして作成されており、「支払表」と名付けられています。
セルH2にプルダウンリストを作り、A列の費目リスト「電気」~「ネット」から選択できるようにし、セルI2には VLOOKUP関数を使い、セルH2で選択した費目に対する F列「合計」の値を取り出すようにします。

このとき、上記「データの入力規則」ダイアログの「元の値」に
  =$A$2:$A$7
というように、セル参照形式で参照するようにすれば、セルH2にプルダウンリストが出来上がります。

でも、せっかく表データを「支払表」というテーブルとしたのですから、「元の値」も構造化参照により表したいところです。

この $A$2:$A$7 というセル範囲は、構造化参照により表わすと
  支払表[列1]
と表わすことができます。
ならば、「元の値」にこれをセットし「OK」してみます。
すると、下図のようなエラーメッセージが現れます。

 

そうなんです。
Excelのデータの入力規則リストで構造化参照は直接は使えません。
でも、INDIRECT関数と組み合わせることで利用可能です。
構造化参照(例:テーブル名[列名])を =INDIRECT("テーブル名[列名]") のように記述すると、テーブルのデータが自動的にリストに反映され、テーブルの追加・削除にも対応できるため、メンテナンス性が向上します。

実際にやってみます。
「元の値」に
  =INDIRECT("支払表[列1]")
と入力し、「OK」します。
セルH2にプルダウンメニューができ、「支払表」テーブルの「列1」データが参照できました。(下図)

 

なぜ INDIRECT関数が必要なのでしょうか。

  • 入力規則の「元の値」で構造化参照を直接指定すると、Excelが正しく認識できません。
  • INDIRECT関数は文字列で指定された名前(この場合は 支払表[列1] )を実際の参照先に変換する役割を果たし、構造化参照を有効にします。 

この方法で、テーブルの範囲が自動拡張してもリストが自動更新される、動的でメンテナンスしやすいプルダウンリストが実現できます。 

最後に、セルI2に VLOOKUP関数を次のようにセットします:
  =IFERROR(VLOOKUP(H2,支払表,COLUMN(支払表[合計]),FALSE),"")
これで、プルダウンリストで費目を選べば、「合計」値が求まります。(下図)