ダウンロード

重複しない表、入力規則リストの自動生成

既存の表を元に、入力規則用選択リストを作成します。

固定の表からではなく、可変の表から選択リストを自動作成することで、計算式の保守が容易になります。
ただし、重複しない項目リスト、必要最小限の高さのリスト作成など、面倒な作業が多々あります。

メニュー
重複しない表の生成 − 配列数式
作業表を使用した従来の方法
入力規則リストの自動作成
入力規則リストの自動作成 − 改良版
サンプルファイルのダウンロード
リンクリスト

重複しない表の生成 − 配列数式

下記の様な購入履歴表があり、この表から、購入者のリストを作成したいと考えています。

重複が無い購入者のリストを作成しなさい。





考え方

1.最初の項目を非重複リストに追加

2.元の表の非重複リスト項目以外をリストアップ

3.残った元の表の最初の項目を非重複リストに新しい項目として追加

1〜3を順に繰り返していけば重複しない項目の表が出来上がる。


これを配列数式で表すと、

1.作成するリストの1行目は、そのままの値を表示(決して重複はしない) 
=C3

2,3 リストの4行目(G4)を考える

 非重複リストの現在位置より上の項目が元の表に無い項目だけのリストを作成
  
IF(COUNTIF(G$3:G3,$C$3:$C$23)=0,$C$3:$C$23,FALSE)
  あった(COUNTIFの結果が0より大きい)場合は、FALSE

 このリストから先頭項目を取り出す
  
VLOOKUP("*", 〜,FALSE)
 検索項目をワイルドカード「*」とすることで、最初に見つかった項目が取り出せる

 式をまとめると
  
{VLOOKUP("*",IF(COUNTIF(G$3:G3,$C$3:$C$23)=0,$C$3:$C$23),1,FALSE)}
 となる。

次項に、作業表を使いCOUNTIF関数で処理する例を記します。

補足

このままでは、リストにエラー(#N/A)が表示されています。

これを防止するには、結果を判定(ISNA,ISERROR,IFERRなどの関数)してエラーであれば空白にする必要があります。

作業表を使用した従来の方法



作業表を段階的に作成、COUNTIF関数を使用して非重複項目のリストを作成していきます。


手順


下記の手順で求めていく

H:非重複リストを作成

最初の項目
 必ず非重複なのでそのまま表示
2番目以降
 元の票の項目が、作成済みの非重複リストに無ければ追加、在れば空白。
 自分と同じ項目の個数は、COUNTIF関数で求める。

I:相対行番号を求める

H列に作成した項目に対応する相対行番号を表示。空白の場合は空白

J:上に詰める

相対行番号の小さい順に求める−SMALL関数
エラー(指定の順位が無い−リストオーバー)の場合は空白

K:購入者を表示

J列の相対行番号とINDEX関数を用いて購入者リストを作成。J列が空白時は空白。

本例の場合、H列の数式が1行目と2行目以降の2種類になるのが難点。
(作成中の非重複リストを参照すると循環参照になる)

改良版



列単位に、数式が数式が1種類になるように改良する



作業表を使う場合は、作成済みの非重複リストを参照するのではなく、
元の表を参照することで、数式を1種類にすることができる。

本例の場合、式の種類は多いが、列単位に同じ式を設定できるため、配列数式よりも綺麗な式とも言える。

入力規則リストの自動作成



前項までの非重複リストを応用すると、入力規則のリストを自動作成できそうです。
ここでは、項目の追加/削除に応じて、入力規則のリストに反映されるようにしてみます。

下記の様な購入履歴表があり、この表から、入力規則用の商品名リストを作成したいと考えています。
そのままでは商品名が重複していますので、重複を除く必要があります。

作成した重複の無いリストを入力規則用のリストとして設定すると、
項目の新規追加自由の入力規則リストが作成できます。


考え方

「重複しないリスト」と同じように、
配列数式を用いて「非重複リスト」を作成。
これを、入力規則のリストの元の値とする。

特徴

項目をリストから選択できる。
新規項目が登場した場合、通常では、入力規則のリストに追加する必要があるが、
本例では、自動的に入力リストが更新される。

不満点

右図のように、項目リスト個数を固定(元の表の行数)としているため、
項目数オーバーの場合にエラーが表示される。
関数(ISERROR,ISNA)を使って空白にしても、今度は、無意味な空白行のリストが残る

次項で不満点を改良!

入力規則リストの自動作成 − 改良版



入力規則のリストがきっちり表示枠内に収まるように工夫してみましょう。

入力リストの表示行数を、非重複リストの項目数と一致させ、表示リストを見易くします。

ここでは、OFFSET関数がキーとなる関数。


考え方

配列数式の表は同じ。

入力規則の「リスト-元の値」の数式を変更します。

実施したいのは、入力規則リストの行数を非重複リストの実リスト項目数と一致させること。

非重複リストの実リスト項目数 は、COUNTIF(範囲,"?*")で求めることができます。
これで、範囲内で、空白で無い(?)1文字で始まり、任意個数の文字(*)終わる文字列の個数を求まります。

エラー(#N/A)は文字ではないのでカウントされません。

求めた項目数で表示するリストの高さを指定すれば、めでたく、下図のように、すっきりとした入力規則リストが作成されます。



  

OFFSET関数

書式 OFFSET(範囲,行数,列数,[高さ],[幅])
 範囲: 元になるセルの範囲
 行数: シフト(移動)する行数−本例では0(そのまま)
 列数: 同、列数
 [高さ]:リストの行数−ここに求めた実リストの項目数を指定
 [幅]: 元の範囲の列数となる(既定値=1)

[ ]は省略可を意味

今後の発展

現在、G列に入力リストの元表として、作業表を作成しています。
一切の作業表を使用せずに、入力規則(のダイアログボックスの中)だけで数式設定が完結できたらステキ!ですね。

がんばってみましょう!



>> トップページ へ    >> エクセル無料教材 へ


×
PageTop