- ベストアンサー
同じ日付の商品名を出力(Excel)
商品名 日付 商品A 2004/1/1 商品B 2004/3/2 商品A 2004/4/5 商品C 2004/1/1 と言うリストがあるとします。 別の検索用のセルに日付を入れると 上に書いたリストの日付と照合して 一致した日付と同じ行にある商品名を出力させたいと思っています。 つまり検索用のセルに「2004/1/1」と入れると 一致した商品名 商品A 商品C のように出力して欲しいのです。 ただ、上のリストでは同じ商品名で同じ日付というのはありませんが、 最終的なリストでは同じ商品名で同じ日付になる可能性もあります。 その際に「一致した商品名」には同じ商品名が複数並んで欲しくないのです。 また、出力が数値ではなく文字列というところでも つまづいてしまいました・・・(まあ数値だったとしてもわからないでしょうが・・) 上に書いたような事はExcel(2002or2000)で可能でしょうか? まことに勝手なのですが、 検索して一致した商品名を更に他の式で使用したい為、 関数またはVBA(できれば関数)でお願いしたいと思います。。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
A B C D E 1 商品名 日付 日付 一致した商品名 2 商品A 2004/1/1 2004/4/5 (出力↓) 3 商品B 2004/3/2 4 商品A 2004/4/5 5 商品C 2004/1/1 関数で行うのは大変だと思います。DGETはダメ? フィルタオプションをマクロ記録する方法もありますが、手を加えるのが少し面倒かもしれません。 直接書いてみました。上のような表を想定します。 セルD2に見つけたい日付を入力し、結果をセルE2から下方向に出力しています。 出力範囲のE2から100行は出力時にクリアしています。実情にあった行数にして下さい。 シートのコードウインドウに貼り付けます。Sheet1で行う場合、 ツール→マクロ→Visual Basic Editor でVBE画面に移り、 表示→プロジェクトエクスプローラでプロジェクトエクスプローラを表示します。プロジェクトエクスプローラのSheet1をダブルクリック。出てきたコードウインドウに下記マクロをコピーして貼り付けます。 ここから ↓ Const SyohinClm = "A" '// 商品のある列(A1は表題、A2からデータ) Const HizukeClm = "B" '// 日付のある列(B1は表題、B2からデータ) Const findYMD = "D2" '// 探す日付 Const outTopCell = "E2" '// 出力セル(先頭) Sub 抽出() Dim inpRow As Long '// 入力セル Dim outRow As Long '// 出力セル Dim outCot As Long '// 出力数 Dim jyufuku As Boolean '// 出力の重複確認 '// 出力範囲をクリア Range(outTopCell).Range("A1:A100").ClearContents '// 検索(単純に探す) For inpRow = 2 To Range(SyohinClm & "65536").End(xlUp).Row If Cells(inpRow, HizukeClm) = Range(findYMD) Then '// 見つけた商品は既に出力したか確認する jyufuku = False For outRow = 1 To outCot If Range(outTopCell).Cells(outRow, 1) = Cells(inpRow, SyohinClm) Then jyufuku = True: Exit For End If Next '// 重複がなければ書き出す If Not jyufuku Then outCot = outCot + 1 Range(outTopCell).Cells(outRow, 1) = Cells(inpRow, SyohinClm) End If End If Next End Sub
その他の回答 (3)
ANo.#3です。 似た様な数式をもうひとつ書かせていただきます。 先ほどと同じフォーマットで C1に =IF(B2=$D$1,COUNTIF($B$2:B2,$D$1),"") と入力してコピー。 D2に =IF(ROW()-1>COUNT(C:C),"",LOOKUP(ROW()-1,C:C,A:A)) としてコピーします。 代わり映えしませんが、どちらでも同じことになります。
お礼
回答頂き、ありがとうございます。 この問題は皆様に回答いただいた内容でなんとか解決できそうです。 どうもありがとうございました。m(_ _)m どの方法でやるかは私の独断では決められない為、 どの方の回答が一番良いのかも決められません。 ですので今回は回答をお送り頂いた順にポイントをお渡ししたいと思います。 ポイントをお渡しできなかった方は真に申し訳ありません。m(_ _)m また質問する機会がありましたら ぜひともまたよろしくお願い致します。
商品名がA列、日付がB列でしたらC2に =IF($D$1=B2,ROW(),"") と入力して下までコピーします。 D1に検索したい日付を入力し、 D2に =IF(ROW()-1>COUNT(C:C),"",INDEX(A:A,SMALL(C:C,ROW()-1))) と入力して下までコピーします。 C列を非表示にしてはどうでしょうか。
お礼
回答頂き、ありがとうございます。 この問題は皆様に回答いただいた内容でなんとか解決できそうです。 どうもありがとうございました。m(_ _)m どの方法でやるかは私の独断では決められない為、 どの方の回答が一番良いのかも決められません。 ですので今回は回答をお送り頂いた順にポイントをお渡ししたいと思います。 ポイントをお渡しできなかった方は真に申し訳ありません。m(_ _)m また質問する機会がありましたら ぜひともまたよろしくお願い致します。
- imogasi
- ベストアンサー率27% (4737/17069)
>「関数で行うのは大変だと思います」とおっしゃている関数式でやって見ます。imogasi方式。 (テストデータ)A1:B16に (C列はまだ見えないが、下記関数式を入れた結果を 説明スペース節約のため先に掲げておきます。) 商品名 日付 C列 a 2004/3/15 0 b 2004/2/12 0 c 2004/5/5 1 d 2004/4/23 1 e 2004/1/1 1 f 2003/12/21 1 g 2004/3/5 1 h 2004/6/6 1 I 2004/5/4 1 j 2004/4/4 1 k 2004/5/5 2 l 2004/3/10 2 m 2004/3/11 2 n 2004/3/12 2 o 2004/5/5 3 (条件) 探す日付をD1セルに2004/5/5 (関数式、C列) C2セルに =COUNTIF($B$2:B2,$D$1) を入れる。C16まで複写。結果は上記の「C列」のようになります。 (関数式、D列) D2セルに =OFFSET($A$1,MATCH(ROW()-1,$C$2:$C$16,0),0) といれ、下に式を複写します。 (結果) D2:D5に c k o #N/A ・・ となります。#N/Aは消してください。 出さない方法は略。 C列は余分な列ですが、この方法では必須で、列非表示にするか右列で目立たない列を使うのが良いかも知れない。
お礼
回答頂き、ありがとうございます。 この問題は皆様に回答いただいた内容でなんとか解決できそうです。 どうもありがとうございました。m(_ _)m どの方法でやるかは私の独断では決められない為、 どの方の回答が一番良いのかも決められません。 ですので今回は回答をお送り頂いた順にポイントをお渡ししたいと思います。 ポイントをお渡しできなかった方は真に申し訳ありません。m(_ _)m また質問する機会がありましたら ぜひともまたよろしくお願い致します。
お礼
回答頂き、ありがとうございます。 この問題は皆様に回答いただいた内容でなんとか解決できそうです。 どうもありがとうございました。m(_ _)m どの方法でやるかは私の独断では決められない為、 どの方の回答が一番良いのかも決められません。 ですので今回は回答をお送り頂いた順にポイントをお渡ししたいと思います。 ポイントをお渡しできなかった方は真に申し訳ありません。m(_ _)m また質問する機会がありましたら ぜひともまたよろしくお願い致します。