1つ目のプルダウンで都道府県を選ぶと、2つ目のプルダウンにその都道府県の市区町村だけが出るようにしたいことがあります。
作り方をネットで検索すると、範囲に都道府県と同じ名前を付けて、INDIRECT関数で呼び出す方法がよく出てきます。実務では、名前を付けずにFILTER関数で作っています。この記事では、その方法を紹介します。
FILTER関数とUNIQUE関数は、Microsoft 365またはExcel 2021以降で使えます。
完成イメージ
入力用のシートのB1で都道府県を選ぶと、B2のプルダウンにその都道府県の市区町村だけが表示されます。
- B1で京都府を選ぶ → B2の候補は京都市北区、宇治市
- B1で大阪府を選ぶ → B2の候補は大阪市北区、堺市
用意するデータ
「データ」シートのA列に都道府県、B列に市区町村を入力し、テーブルにしておきます。テーブル名は「住所」にしました。
| 都道府県 | 市区町村 |
|---|---|
| 京都府 | 京都市北区 |
| 京都府 | 宇治市 |
| 大阪府 | 大阪市北区 |
| 大阪府 | 堺市 |
| 滋賀県 | 大津市 |
| 滋賀県 | 草津市 |
テーブルにしておくと、市区町村が増えたときも行を足すだけで、プルダウンの候補に入ります。テーブルの便利なところは、こちらの記事で紹介しています。

プルダウン1の候補をUNIQUE関数で出す
データのA列には、同じ都道府県が何度も並んでいます。そのままプルダウンにすると、京都府が何回も表示されてしまいます。
そこで、入力用のシートのY1に、UNIQUE関数で重複をなくした都道府県の一覧を出します。
=UNIQUE(住所[都道府県])
Y1から下に、京都府、大阪府、滋賀県が表示されます。
実務では、都道府県だけの列を別に用意しています。UNIQUE関数を使えば、その列を用意しなくても一覧を作れます。
次に、B1にプルダウンを設定します。
- B1を選び、[データ]→[データの入力規則]を開く
- [入力値の種類]で「リスト」を選ぶ
- [元の値]に
=$Y$1#と入力する
# は、Y1から表示されている範囲全体を指す書き方です。都道府県が増えて一覧が長くなっても、設定を直す必要はありません。
プルダウン2の候補をFILTER関数で出す
Z1に、B1で選んだ都道府県の市区町村だけをFILTER関数で出します。
=FILTER(住所[市区町村],住所[都道府県]=$B$1,"")
FILTER関数は、1つ目の引数に取り出す範囲、2つ目に条件を書きます。3つ目の "" は、該当するデータがないときに空白を表示するためのものです。B1が空のときに #CALC! エラーになるのを防げます。
B2にも、B1と同じ手順でプルダウンを設定し、[元の値]に =$Z$1# と入力します。
これで、B1で選んだ都道府県に合わせて、B2の候補が変わるようになります。
INDIRECT関数の方法と比べたメリット・デメリット
検索するとよく出てくる、範囲に名前を付けてINDIRECT関数で呼び出す方法と比べると、FILTER関数の方法には次のメリットとデメリットがあります。
| 内容 | 理由 | |
|---|---|---|
| メリット | 名前の定義がいらない | 2つ目の候補をFILTER関数でデータから直接取り出すため |
| メリット | 項目が増えても、行を追加するだけで済む | テーブルと # の参照で、候補の範囲が自動で広がるため |
| メリット | ブックが重くなりにくい | 揮発性関数のINDIRECT関数を使わないため |
| デメリット | シートの隅に候補を表示しておく必要がある | プルダウンはFILTER関数の結果(Z列など)を参照するため |
| デメリット | 1か所でしか使えない。行ごとにプルダウンを並べる場合はINDIRECT関数の方法を使う | 候補を表示する場所がプルダウン1組分しかないため |
実務では、プルダウンは1か所だけなので、この方法で十分です。
1つ目を選び直しても2つ目は残る
B1の都道府県を選び直しても、B2には前に選んだ市区町村が残ったままになります。たとえば、京都府・京都市北区を選んだあとにB1を大阪府に変えても、B2は京都市北区のままです。
これはExcelの仕様で、INDIRECT関数の方法でも同じです。データの入力規則は、入力したときにしかチェックしないためです。関数だけで自動的に消すことはできません。1つ目を選び直したら、2つ目も選び直してください。
まとめ
- 1つ目のプルダウンの候補は、UNIQUE関数で重複をなくして出す
- 2つ目のプルダウンの候補は、FILTER関数で1つ目に合うものだけを出す
- 入力規則の[元の値]は
=$Y$1#のように#を付けて参照する - 名前の定義もINDIRECT関数も使わないので、データが増えても直す必要がない
- 1つ目を選び直したら、2つ目も選び直す
