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

「県」を選択すると、「市」のリストは選択した県の中のリストに自動的に変化する例です。計算式の応用でこのように動的にリストの内容を変更させることができます。
     東京都の「市」のリスト
 


   
 









 
 
 関東地方の「県」のリスト ()
 
 


「埼玉県」の「市」のリスト

 
 


「県」を「東京都」に変更

 


東京都の「市」のリスト  
 








「関東地方」シート 1
「関東地方」シート21  
 
 
 


データの入力規則 1
 使
 


データの入力規則

=IF($B$2<>""
   ,OFFSET(関東地方!$A$2
          ,0
          ,MATCH($B$2,関東地方!$A$1:$G$1,0)-1
          ,COUNTA(OFFSET(関東地方!$A$2
                        ,0
                        ,MATCH($B$2,関東地方!$A$1:$G$1,0)-1
                        ,1000
                        ,1
                        )
                 )
          ,1
          )
   ,$A$1
   )
このようになります。関数の左カッコ、各引数のカンマ、最後の右カッコを同じ桁位置にしています。
以下の関数を使用しています。
関数概略説明
 IF関数  比較判断を行ない、肯定時と否定時に分けます。引数は以下の通りです。
 ① 比較判断式
 ② 肯定時の値(または処置式)
 ③ 否定時の値(または処置式)
 OFFSET関数  セル参照の位置と範囲(サイズ)を変更します。
 引数は以下の5個で、サイズに関わる4番目以降は省略できます。
 ① 基準となるセルまたはセル範囲
 ② 移動する行方向の行数で「0」なら行方向は移動せず、マイナスなら上へ移動します
 ③ 移動する列方向の列数で「0」なら列方向は移動せず、マイナスなら左へ移動します
 ④ サイズを変更する場合の行数
 ⑤ サイズを変更する場合の列数
 MATCH関数  検査範囲(セル範囲)から検査値を探して、その相対位置(n番目)を返します。
 引数は「検査値」「検査範囲」「照合の型」で「照合の型」は省略できます。
 「照合の型」で「0」を指定すると完全一致となり、検査範囲の並び順は問いません。
 COUNTA関数  セル範囲での空白でないセルの個数を返します。
 引数は「対象セル範囲」のみ。
次から数式の構成と関数の組み合わせを説明します。
  • 一番先頭(外側)に位置する「IF関数」は「県」のセルに入力があるか、の判定です。
    入力があれば「市」のプルダウンリストの生成を行なわせ、入力がなければ「市」のプルダウンリストは空にするように動作します。
    ここでは「県」のセルに不正な値があるかなどはチェックしていません。「データの入力規則」の「リスト」の設定側でリスト設定以外の値は「禁止」としているので、 入力があればプルダウンリストの生成は可能だと判断できている訳です。
    なお、この「IF関数」の否定側の値「$A$1」はプルダウンがある側のシートの左上角のセルで「空文字列」にあたります。
  • OFFSET関数」が今回の要件でのメインとなる関数です。
    プルダウンリストを生成する参照先となる「関東地方」シートのセル範囲の位置とサイズをこの関数で制御しています。
    第1引数の「基準セル」は「関東地方」シートのA列2行目(「水戸市」のセル)です。これは起点として固定です。
    第2、3引数が「基準セル」からの行方向、列方向の移動数です。今回は縦への移動はありませんので第2引数はゼロ固定です。
    第3引数が列方向(横方向)の移動数で、ここで「MATCH関数」を呼び出して、1行目の県名を探して移動数を求めます。
    第4、5引数が移動先での行方向、列方向の「サイズ」です。今回は列方向(横方向)は1列固定なので1固定です。
    第4引数で選択した「県」に従属する「市」の数をセットします。 先頭側の「OFFSET関数」と「COUNTA関数」に従属した方の「OFFSET関数」では、 この第4引数だけが異なっており、「COUNTA関数」に従属した方の「OFFSET関数」では1000固定として、 一旦大きい値でセル範囲の有効数をカウントして先頭側の「OFFSET関数」に渡すようにしています。
  • MATCH関数」は都道府県による列方向の移動数を算出させています。
    「関東地方」シートの1行目を横に検索し、一致する列の相対番号を取得します。
    OFFSET関数」の第3引数に渡す際は「移動数」なので、「茨城県(A)」で一致する場合は「0」とするため1を差し引いています。
  • COUNTA関数」は「市」のプルダウンリストの縦方向のサイズに当たります。
    機能は「空白でないセルの個数」ですが、「関東地方」シートには途中の「抜け行」はないのでセル範囲の「行数」として問題ありません。
  • OFFSET関数」に「MATCH関数」を絡めた数式のサブセットが似た内容で2つあり無駄なように見えますが、 「都道府県」の列を決めてから行数範囲を算出する方法として、2回発行せざるを得ないということです。
    VLOOKUP関数」などでの単なる値検索であれば、縦方向を大きな値で範囲を広く取っておくだけでも機能しますが、 このプルダウンリストの用途だと、広く取ってしまうとプルダウンリストの下にブランク行が付いて見えてしまいます。