リスト選択(入力規則)のリスト内容の件数や対象が変わる場合の対応

「県」を選択すると、「市」のリストは選択した県の中のリストに自動的に変化する例です。計算式の応用でこのように動的にリストの内容を変更させることができます。
「作業列」を使わないサンプル(Excel2007(*.xlsx)以降)
上のサンプルでは可変セル参照式を視覚的に説明するために「作業列」を利用しましたが、「作業列」を使わないサンプルも作ってみようと思います。 この方法では「INDIRECT関数」も使用しません。
動的に「リスト」の内容を変化させる
このように、従来のD列の中間計算セルは全くありません。
「県」の「入力規則」の「リスト」では先に説明したように上から3番目の画像のように計算式を設定すればよく、D2セルの計算式は不要になります。

ですが、D4セル、D5セルの計算式を排除するとなると「市」の「入力規則」の「リスト」の計算式はやや複雑になります。 「県」によって参照列が変異する他、県によって市の数が異なるため、参照する行数も変異させなければなりません。
動的に「リスト」の内容を変化させる
式が長く画像には収まりません。整理して改行をつけて表現すると、

=IF(R2C2<>""
   ,OFFSET(関東地方!R2C1
          ,0
          ,MATCH(R2C2,関東地方!R1C1:R1C7,0)-1
          ,COUNTA(OFFSET(関東地方!R2C1
                        ,0
                        ,MATCH(R2C2,関東地方!R1C1:R1C7,0)-1
                        ,1000
                        ,1
                        )
                 )
          ,1
          )
   ,R1C1
   )
このようになります。
さて、先頭のIF関数から最深のMATCH関数まで最大で5層のネストになってしまうわけですが、これにより、今回の目的は実現できました。

普段あまり使うことがない「OFFSET関数」が2回も登場します。 実は「OFFSET関数」は参照するセル範囲を動的に変異させる時に「行列位置」と「セル範囲の大きさ」一度に変えることができる非常に便利な関数なのです。
OFFSET関数」の引数は5つあり、以下のようになります。
①起点セル(参照範囲の左上セル)
②行方向オフセット(ズレ)量
③列方向オフセット(ズレ)量
④行方向の高さ(行数)
⑤列方向の幅(列数)
※②、③は起点セルからのズレがない時はゼロになります。
2回登場する「OFFSET関数」の後(下)方のものは選択した「県」の中の「市」の行数をカウントさせるためのセル範囲の設定ですが、 起点セルは2回の「OFFSET関数」で同じで「関東地方!R2C1」です。また、行方向オフセットはともにゼロです。
列方向オフセットはともに、

MATCH(R2C2,関東地方!R1C1:R1C7,0)-1
で「関東地方」シートの1行目で「県」を探すMATCH関数から1を差し引いています。1を差し引くのはゼロ起算だからです。
行方向の高さは「1000」としており1000行分のセル範囲をCOUNTA関数に渡して実際のデータ個数をカウントさせています。

そして、このCOUNTA関数の結果が先(上)方の「OFFSET関数」の行方向の高さとなって、入力規則の「リスト」の行数として正しく現われるようになっています。