- ベストアンサー
EXCELで日付をKEYとしてデータをもってくる方法
お世話になります。 EXCELで日付をKEYとして、別シートからVLOOKUP等で データをもってきたいのですがその方法についてご教授ください。 具体的には、 シートAに10月の商品受注データが入っていると仮定し、 シートBのどこかのセルに10/1、10/7、と入力することで シートBに10/1-7迄の受注データのみを表示させることができればと 考えています。 ------------------------------- シートA(10月受注データ) 10/1 商品X 個数 単価 10/1 商品X 個数 単価 10/3 商品Y 個数 単価 10/4 商品Z 個数 単価 10/8 商品X 個数 単価 10/10 商品Z 個数 単価 ・ ・ ・ ------------------------------- シートB(10/1~10/7迄の受注データ) 10/1 商品X 個数 単価 10/1 商品X 個数 単価 10/3 商品Y 個数 単価 10/4 商品Z 個数 単価 ------------------------------- ご回答宜しくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
データ→フィルタ→フィルタオプションの設定から次の方法で如何でしょうか。 (1)シートAに見出し行を挿入(仮に日付、商品名、個数、単価とします) (2)シートBのA1,B1に「日付」の文字入力、A2に>=10/1、B2に<=10/7を入力 (3)シートBの任意セル上でデータ→フィルタ→フィルタオプションの設定→(警告メッセージが表示されてもOKで継続) (4)指定した範囲を選択、リスト範囲欄はシートAのデータ範囲、検索条件範囲欄に$A$1:$B$2、抽出範囲はシートBの任意セル→OK 因みに(3)~(4)をマクロ記録しておくと抽出操作が簡単です。
その他の回答 (4)
日付が昇順になっているなら、それほど難しくないでしょう。 シートBのA1セルに 10/1、B1セルに 10/7 を入力するとして、 A2=MATCH(A1,SheetA!A:A,0) B2=MATCH(B1,Sheet1!A:A,1) A2セルとB2セルに、SheetAの何行目から何行目までもってくればいいのか出るので、 表示させたいセルに =IF(ROW(A1)-1<=$B$2-$A$2,INDEX(SheetA!A:A,$A$2+ROW(A1)-1),"") 右へ、下へ、コピー。
お礼
なるほど、そういう方法もあるんですね。 残念ながら実データの日付は昇順にはなっておりませんが、何か他のケースの場合にも使えそうです。 回答どうもありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
>からVLOOKUP等で VLOOKUP関数は該当したデータの一番最初行しか探せません。常識です。 だから方法として的外れ。 ーー 操作では、データーフィルターフィルタオプションの設定で出来ます・ ーー 関数では作業列を使えば出来ます。(下記) ーー 使わない場合は関数では、非常に難しい式になります。 ーー 日付データが日付シリアル値であるかどうかを知りたい。 日付シリアル値であれば、整数で、条件は、ある整数より大きく ある整数より小さいという条件で、わざわざ日付ですが、どうしましょう」と聞くことは無い。 ーー あとVBAでやれば出来る。 アクセスと連携する方法などもある。 ーーーー 例データ Sheet1で A列 B列 C列 D列(作業列) 2008/10/1 2008/10/7 10月1日 商品X 個数1 単価1 1 10月1日 商品X 個数2 単価2 2 10月3日 商品Y 個数3 単価3 3 10月4日 商品Z 個数4 単価4 4 10月8日 商品X 個数5 単価5 10月10日 商品Z 個数6 単価6 10月6日 商品Z 個数7 単価7 5 D2の式は =IF(AND(A2>=$A$1,A2<=$B$1),MAX($E$1:E1)+1,"") 下方向に式を複写。 Sheet2で A2に =INDEX(Sheet1!$A$1:$C$100,MATCH(ROW()-1,Sheet1!$E$1:$E$100,0),COLUMN()) C2まで式を複写 A2:C2の式を下方向に式を複写 結果 2008/10/1 商品X 個数1 2008/10/1 商品X 個数2 2008/10/3 商品Y 個数3 2008/10/4 商品Z 個数4 2008/10/6 商品Z 個数7 #N/A #N/A #N/A #N/Aを出さないようにするのはSheet2のROW()-1 がSheet1のE列のMAXを超えているか聞く =IF(ROW()-1>MAX(Sheet1!$E$1:$E$100),"",INDEX(Sheet1!$A$1:$C$100,MATCH(ROW()-1,Sheet1!$E$1:$E$100,0),COLUMN())) 以上imogasi方式。
お礼
確かにVLOOKであれば10/1のデータが2つ以上あった時に対応できませんね・・ 今回はフィルタオプションで対応いたします。 詳細な説明どうもありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
まず最初にフィルタオプションを利用する方法を説明します。フィルタオプションで条件抽出するためには必ずタイトル行が必要ですから、シートAにタイトルを付けます。こんな具合です。 以下先頭セル(日付と入力した)セルをA1セルとして説明します 日付 商品名 数量 単価 10/1 商品X 個数 単価 10/1 商品X 個数 単価 10/3 商品Y 個数 単価 10/4 商品Z 個数 単価 10/8 商品X 個数 単価 10/10 商品Z 個数 単価 シートBのA1セルから以下のように検索条件を入力します タイトルの「日付」は今回は検索条件が2つなので2つ(2列分)必要です 日付 日付 >=2008/10/1 <=2008/10/7 次にシートBを開いた状態で「データ」→「フィルタ」→「フィルタオプションの設定」を選びます 「指定した範囲」を選択し、リスト範囲には元データ範囲を指定します。例えば「SheetA!A1:D100」のようになります。検索条件範囲は「A1:B2」になります。抽出範囲には抽出結果を表示する先頭セルを指定します。(例えば「A5」など) 「OK」をクリックすると、指定した条件(10/1~10/7)に合致するデータが抽出されます。(実際に質問のデータで試した結果です) 日付 商品名 数量 単価 10/1 商品X 個数 単価 10/1 商品X 個数 単価 10/3 商品Y 個数 単価 10/4 商品Z 個数 単価 ただしフィルタオプションの操作はシートAのデータが変更されても自動的には変更されません。この操作を毎回行う必要があります。 また関数を用いて条件に合致するデータをシートBに表示させる方法もあります。この方法はシートAが変更されたら直ちにシートBの表示も変更されます。ただし「データが多いと処理が重くなる」「関数式が難しい」という欠点がありますのでフィルタオプションを利用する方法とと一長一短です シートBのA1に「10/1」、B1に「10/7」を入力しておきます (シートAもシートBもエクセルの日付形式と想定しています) シートBの適当なセルに =INDEX(SheetA!A:A,SMALL(INDEX(SUBSTITUTE((SheetA!$A$1:$A$500>=$A$1)*(SheetA!$A$1:$A$500<=$B$1)*1,0,10^5)*ROW(SheetA!$A$1:$A$500),),ROW(A1))) を貼り付けて、そのセルを右方向および下方向にコピーしてください。すると以下の結果が得られますが表示するデータがない行はエラーになります。 10/1 商品X 個数 単価 10/1 商品X 個数 単価 10/3 商品Y 個数 単価 10/4 商品Z 個数 単価 #REF! #REF! #REF! #REF! エラーを表示したくないなら条件判定を追加して以下の式にしてください =IF(ROW(A1)<=SUMPRODUCT((SheetA!$A$1:$A$500>=$A$1)*(SheetA!$A$1:$A$500<=$B$1)*1),INDEX(SheetA!A:A,SMALL(INDEX(SUBSTITUTE((SheetA!$A$1:$A$500>=$A$1)*(SheetA!$A$1:$A$500<=$B$1)*1,0,10^5)*ROW(SheetA!$A$1:$A$500),),ROW(A1))),"") なおシートAに範囲は1~500行目までとしていますので、もし実際のデータがもっと多いなら変更が必要です (変更が必要なくらいデータが多いなら遅くて実用に耐えないかもしれませんが…)
お礼
ありがとうございました。 式を用いた方が不要な列を表示させなくする事も可能なので、良いかと思ったのですが、予想以上に複雑な式になるので、、、 データは数十件程なのですが、使用頻度として週一度くらないので フィルタオプションで対応したいと思います。
- yama1718
- ベストアンサー率41% (670/1618)
http://www.eurus.dti.ne.jp/~yoneyama/Excel/filter3.htm#tyusyutu このへんの記事が参考になるかと思います。
お礼
迅速な回答ありがとうございました。 フィルタオプションで実現できました。
お礼
ありがとうございます。 非常に分かり易い回答です。参考になりました。