データベース関数で検索する時には DGET関数を使います。この関数の長所と短所は下記の通りです。便利なんですけどね……
●メリット:
処理がとても速い
フィルタオプションの設定と同様に 複数の条件や複雑な条件にも対応できる
●デメリット:
重複するデータがあるとエラーが返る
条件の書き出しが必須なので 検索結果を縦方向に並べることができない。
このデメリットが大きい為 大抵の場合 複数条件での検索となると 作業列を使って検索範囲をまとめるか
データのテーブル機能を使うか 配列数式か SUMPRODUCTを使うことになると思います。その場合
複数条件での合計と やることは同じです。なんとかこの関数をうまく使えないもんかと思って ちょっといじってみました。
まずは価格表の作成です。データベースですから実際には色づけなどは必要ないと思いますが見分けを付けやすいように1行置きに背景色に色づけしています。本来ならコード番号で管理するべきですが
見積書の作成をする時にはリストから選択できた方が 便利な時もあるでしょうから 今回はわざとコード番号を入れていません。
このようなデータベースを作成します。もちろん実際にはもっとたくさんデータがあると想定しています。
しかしこの表では商品名をリスト入力する際に 同じ名前が並ぶことになります。重複を省いたリストを別途作成しておいた方が良いと思います。
A列を列参照して [データ]→[フィルタ]→[フィルタオプションの設定]
→[抽出先]を[指定した範囲]にする
→[抽出条件範囲]は空白にして [抽出範囲]に「G2」と入力
→重複するレコードは無視するにチェック
→[OK]
これで重複を省いた商品リストが作成できます。
ついでにこのリストとデータベースに名前を定義しておきましょう。
[挿入]→[名前]→[定義]
名__前:価格表
参照範囲:=OFFSET(価格表!$A:$E,,,11)
名__前:商品名
参照範囲:=OFFSET(価格表!$G$2,,,COUNTA(価格表!$G:$G)-1)
→[OK]
これ価格表の準備は万端です。
今回は価格を表示するので見積書にします。
まずはリストの作成から
B4:B8セル を選択して [データ]→[入力規則]
[入力値の種類]を[リスト]に設定→[元の値]に「個,セット」と入力
→[OK]
続けて C4:C8セル を選択して [データ]→[入力規則]
[入力値の種類]を[リスト]に設定→[元の値]に「=商品名」と入力
→[OK]
この「種類」と「商品名」から「規格」「金額」「概要」を検索するということにします。
A列の文字色を「白」に設定
■A4セル
=AND(価格表!C2=B$4,価格表!A2=C$4)
これで良いのですが これを A5・A6セルとコピーしようとすると 参照するセル番地がずれてしまいまう為 単純にオートフィルコピーすることができません。といって ひとつずつ条件式を設定するのは面倒です。そこで
A列の文字色を「白」に設定
■A3セル
="=AND(価格表!C2=B$"&ROW(A3)&",価格表!A2=C$"&ROW(A3)&")"
A8セルまでオートフィルコピー
A4:A8セルを選択→コピーして右クリック[形式を選択して貼り付け]→[値]にチェックして[OK]
そのまま [データ]→[区切り位置]→何もせずに[完了]
これで条件式をコピーすることができます。条件が変わった時は A3セルを編集して 再度同じ作業をするだけです。
★★★
もうひとつ別の方法を思いつきました。マクロ関数の EVALUATEを使えば 上の作業を 名前の定義で処理できますね。(06.03.30)
A4セル上で [挿入]→[名前]→[定義]
名__前:抽出
参照範囲:=EVALUATE("=AND(価格表!C2=B$"&ROW(A4)&",価格表!A2=C$"&ROW(A4)&")")
→[OK]
■A4セル
=抽出
下方向にオートフィルコピー
これだけです。値コピーなどの処理は不要です。最後に データベース関数を入れます。
■D4セル
=IF(ISERR(DGET(価格表,2,A3:A4)),"",DGET(価格表,2,A3:A4))
■E4セル
=IF(D4="","",DGET(価格表,4,A3:A4))
■F4セル
=IF(ISERR(DGET(価格表,5,A3:A4)),"",DGET(価格表,5,A3:A4))
下方向にオートフィルコピー
→参考ファイル (009.xls)
「どうしても数式でやりたい」ならという程度の話なので 特別お勧めはしません。