• ベストアンサー

Excelでこんなことできますか?

次の様な表があります。  食品 │購入日  たらこ│10/8  りんご│9/3  わかめ│2/4  椎茸 │10/8 この表を並べ替え無しで、特定の購入日(10/8)に購入した食品をすべて(たらこ・椎茸)抽出したいのです。 VLOOKUPではTRUE,FALSEどちらを使っても"たらこ"しか抽出されません。 最終的には、 10/8│たらこ│椎茸 の様にしたいのですがいかがでしょう? できればワークシート関数のみで解決したいと思っています。 どうぞ知恵をお貸しください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

   A     B    C    D   E F G H 1 食品    購入日 2 たらこ 10月8日 10月8日 たらこ 椎茸 → → → 3 りんご  9月3日 4 わかめ  2月4日 5 椎茸  10月8日 上表を想定し、C2に日付を入力し、D2から右に結果を出力してみます。 B列は日付属性とします。 A2:A5 に「dataA」の範囲名 B2:B5 に「dataB」の範囲名 を付けます。 D2:H2を選択し、D2に下記算式を入力し、Ctrl+Shift+Enterで登録します。 (配列数式なのでCtrlキーとShiftキーを押しながらEnterキーを押します。)   ※1.D2に下記算式を普通に入力し(この回答をコピーで可)Enter    2.D2:H2を選択しファンクションキーF2を押して    3.Ctrl+Shift+Enter で登録       が間違いないでしょう。 配列数式として登録できれば、式は{ }で囲まれて表示されます。 =IF(ISERR( INDEX(dataA,SMALL(IF(dataB=$C$2,ROW(dataA),99999),COLUMN()-3)-1)),""      ,INDEX(dataA,SMALL(IF(dataB=$C$2,ROW(dataA),99999),COLUMN()-3)-1)) 2行に分けていますがつながった1つの式です。 関数なので、データ内容が変われば更新されます。 該当しない場合の処理をしていますが、ある意味、単純な式です。 式の意味は、条件に合致するセルの行番号を求めて、INDEX関数を使い、昇順に表示しています。 順序を指定するために「COLUMN()-3」を使っています。D列が該当した1番小さな行番号になります。 また、条件に合致しない場合は行番号に99999を割り当ててエラー処理をしています。 関数でデータ抽出を行う例です。ご参考に。

その他の回答 (3)

回答No.3

ちょっと複雑ですが 食品をA1 購入日B1としたときD2に=IF($G$2=B2,A2,"")と式をいれ下へ必要行数分コピーします。(G2には10/8を入れる) 次にC2に=IF(D2="",C1,C1+1)の式を入れやはり必要行数分下へコピーします。 1|たらこ 1| 1| 2|椎茸 のような表が出来ますが歯抜け状態なのでこれをなおします。 C10からC14まで1から5までの数字を入れます。 D10に=VLOOKUP(C10,$C$2:$D$5,2,FALSE)を入れD14までコピー。 1|たらこ 2|椎茸 3|#N/A 4|#N/A 5|#N/A となります。 次にこれを横並びにします。 H2に=VLOOKUP(COLUMN()-7,$C$10:$D$14,2)をいれH6までコピーします。 10/8|たらこ|椎茸|#N/A|#N/A|#N/A| と表示されます。 |#N/Aが気になるときは関数で計算結果がエラーのときは計算しないようにすればok 途中の計算式が邪魔なときは別のシートへ「=」で引き出してから計算してください。

osafune
質問者

お礼

kiichi_goさん、こんにちは。 早速の回答ありがとうございます。 ムムムッ!スゴイっ!! そうかぁ。いくつかのステップに分ければイイんですね。(^o^)/ 早速、会社で試してみます。ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

こう言う検索型の問題を関数式だけでやるのは難しい と思います。どこが難しいのか下記に書いてみました。 良ければご覧になってください。 http://www.okweb.ne.jp/kotaeru.php3?q=528247 エクセルの使い方は (1)手操作(入力、コピー、書式設定、行列操作など    多数) (2)関数式<(1)と(2)はほぼ必ず組み合わせて    利用。> =sumからvlookup・TRANSPOSE・Dsumなど ウイザード的なものまであります。 (3)ウイザード(グラフ・ピボットテーブル・オート    フィルタなど) (4)VBA(マクロ) などに私は分類して考えていますが、#1のご回答などは(3)にあたるのですが、その結果が出た先の処理(本例では2件を同行に並べるなど)は手作業と言うことが多いので、#1のお礼に書かれたような要求になると思いますが、(4)を使わない解決しないでしょう。

osafune
質問者

お礼

imogasiさん、こんにちは。 早速の回答ありがとうございます。 そ~ですねぇ…やっぱりワークシート関数のみでシンプルにっていうのは難しいですね。

回答No.1

こういう事は関数でやるよりオートフィルターを使った方が良いと思います。 やり方: 表内にセルポインタをおきます(表内であればどこでも良い) 次にメニューよりデータを選択、プルダウンメニューよりフィルタを選択、オートフィルタにチェックを入れます。すると各項目名の横に▼が出来ますから、購入日の横の▼をマウスでクリックし10/8を選択します。

osafune
質問者

お礼

kiichi_goさん、こんにちは。 早速の回答ありがとうございます。 実は、現在オートフィルタをつかっているのですが、結果の表を別表として自動的に作成したいと考えているのです。 オートフィルタで結果を抽出し、それをコピーし罫線等を入れたフォーマットにペーストして、別表を作成しています。 毎週この作業を行なうのですが面倒なので、別表作成を完全に自動化したいのです。 なにか良いアイデアがありますでしょうか?

関連するQ&A

専門家に質問してみよう