表の名前定義とINDIRECT関数を使った方法が知られていますが、ここではXLOOKUP関数で実現してみます。
手順
はじめにやりたいことの確認です。
左側にある表の見出しには地区名が記録されており、地区名の下にはその地区に属する店舗名が記録されています。
G列にプルダウンを設定して地区名のうち1つを入力させ、さらに同じプルダウンをクリックすることで地区名に対応する店舗名のうち1つを入力させるよう設定します。
まずは入力範囲(G3:G9)を選択し、メニューの「データ」タブ内にあるデータの入力規則のアイコンをクリックします。
ダイアログが出ます。
「入力値の種類」欄からは「リスト」を選択します。
そして「元の値」欄には次のような式を入力します。
「元の値」欄の式
=XLOOKUP($G3,$B$2:$D$2,$B$3:$D$7,$B$2:$D$2)
絶対参照を使っていますが第1引数(検索値)だけ「$G3」となっていることに注意してください。
意味としては、自身のセルの値を左の表の見出しから検索し、あったらその下にある(地区名に対応する)店舗の一覧を、なかったら見出しの一覧を返す、というものです。
あとはOKをクリックするだけで設定完了です。
G列のセルをクリックすると、選択肢として地区名が表示されます。
地区名を入力してから再度同じセルをクリックすると、地区内の店舗名が選択肢として表示されます。
店舗名を入力してから再度同じセルをクリックすると、地区名の選択に戻ります。
ただし、選択した店舗名が地区名のいずれかと重複する場合は地区名の選択に戻りません(地区名が選択された状態であるとみなされるため)。普通そのようなデータの設定はしないと思いますが、値を削除すれば地区名から選択し直せます。
もちろんですが、別の行の値に影響されることなく入力を進められます。
備考
異なるデータ形式(横持ち、縦持ち)への対応や、選択肢として空白を出さない方法については次の記事で紹介しています。