- ベストアンサー
エクセル 他シートの日付毎データ取得
エクセル2003を使用しています。 以下のようなデータ群(例:一ヶ月間の仕入れ日・品物)があり、 それを日付毎に別シートに移す作業を行いたいと思います。 ◆データ◆ A B 2010/3/1 りんご 2010/3/1 みかん 2010/3/2 パイン 2010/3/2 いちご 2010/3/2 みかん ・ ・ ・ ◆移す先◆ A B C D ・・・・ 2010/3/1 りんご みかん 2010/3/2 パイン いちご みかん ・ ・ ・ このように、一行にその日仕入れた品物を右方向に列記していく操作です。 予め、移す先の日付だけは1ヶ月分全てA列に記載しますので、品物名の 引き込みだけを行います。 既に体裁は作ってあるのですが、引き込む側のほうにどのような関数を 使えばいいのかがよくわかりません。 よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
提示されたレイアウト(Sheet1のA1セル以下にデータが入力されていて、抽出先シートのA1セルに日付が入力されている)なら、Sheet2のB1セル(A1セルに検索する日付が入力されている)に以下の式を入力し下方向にオートフィルします。 =INDEX(Sheet1!$B:$B,SMALL(INDEX((Sheet1!$A$1:$A$1000<>$A1)*1000+ROW(Sheet2!$A$1:$A$1000),),COLUMN(A1)))&""
その他の回答 (6)
- silverfd
- ベストアンサー率57% (204/356)
#4です、連投すみません、記述が大変わかりにくいので、解説させて下さい。最近回答中に締め切られてしまうケースが多いもんで、ちとあせりました。 要は、C列~F列に各商品の存在フラグを立てるという形です。そして、B列はそのフラグによって、商品名を組合せています。 >そして、これを全部コピーしますが、そのセル自体をコピー先に含めずいっこいっこやって下さい。 これは、C2をC3、D2~F3までコピーという意味です。各商品のフラグです。 工夫点は、構造上この「りんご」やらを別名にしても動くようになっています。Sheet2のC1~F1の文言を直接書き換えます。不親切にデータベースの範囲がA1:B6だけですが、拡大する場合はこの6を10000とかに変更して、上記のように再度コピーして下さい。注意点として、配列はどうもExcel2003ではA:Aとかだと拾ってくれません。範囲指定(A1:A6)が必要なようです。
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1では1行目は項目名でA列およびB列が使われているとします。 C列は作業列としてC2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",IF(COUNTIF(A$2:A2,A2)=COUNTIF(A:A,A2),MAX(C$1:C1)+1,"")) またD2セルには次の式を入力して右横方向にドラッグコピーしたのちに下方向にもオートフィルドラッグします。 =IF($A2="","",IF(AND($A1<>$A2,COLUMN(A1)=1),$B2,IF(AND($A1=$A2,D1<>""),D1,IF(AND($A1=$A2,D1="",COLUMN(A1)<=COUNTIF($A$2:$A2,$A2)),$B2,"")))) その後にシート2では1行目が項目名でA1セルには日付、B1セルより右には品名とでも入力します。 A2セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。 =IF(COUNTIF(Sheet1!$C:$C,ROW(A1))=0,"",IF(COLUMN(A1)=1,INDEX(Sheet1!$A:$A,MATCH(ROW(A1),Sheet1!$C:$C,0)),INDEX(Sheet1!$C:$X,MATCH(ROW(A1),Sheet1!$C:$C,0),COLUMN(A1)))) 最後にA列の表示形式は日付にします。
- silverfd
- ベストアンサー率57% (204/356)
数式だけで出来ましたよ。 Sheet1 日付 商品 3月1日 りんご 3月1日 みかん 3月2日 パイン 3月2日 いちご 3月2日 みかん Sheet2 日付 商品 りんご いちご みかん パイン 3月1日 りんご みかん 1 0 1 0 3月2日 いちご みかん パイン 0 1 1 1 みづらいですけど、うまくシートに展開して下さい。要はC1がりんご、C2が1、C3が0ですね。 Sheet2の数式は、Sheet2のC2(りんごの下)は、 {=SUM(IF(Sheet1!$A$2:$A$6=Sheet2!$A2,1,0)*IF(Sheet1!$B$2:$B$6=Sheet2!C$1,1,0))} で、これ配列なので、{}をとった数式を「Ctrl+Shift」でEnterして下さい。 そして、これを全部コピーしますが、そのセル自体をコピー先に含めずいっこいっこやって下さい。 含めてばーっとやろうとすると「配列は変更できません」と出てやれませんので。 そして、Sheet2のB2(商品の下)には、 =IF(C2>0,$C$1&" ","")&IF(D2>0,$D$1&" ","")&IF(E2>0,$E$1&" ","")&IF(F2>0,$F$1&" ","") これで、日付にみかんやらいちごやらが一つ以上あれば、半角スペースで上記順番で言葉をつなげて行きます。 わからなかったら、補足でどうぞ。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 一例です。 Sheet1の2行目からデータがあり、Sheet2のA列は日付があらかじめシリアル値で入力されているものとします。 1行目は見出し行だとして、2行目からの入力になります。 配列数式になってしまいますので、この画面からコピー&ペーストしただけではエラーになると思います。 Sheet2のB2セルに貼り付け後、F2キーを押す、又はB2セルでダブルクリック、又は数式バー内で一度クリックします。 編集可能になりますので、Shift+Ctrl+Enterキーで確定します。 数式の前後に{ }マークが入り配列数式になります。 Sheet2のB2セルに =IF(COUNTIF(Sheet1!$A$2:$A$1000,$A2)<COLUMN(A1),"",INDEX(Sheet1!$B$2:$B$1000,SMALL(IF(Sheet1!$A$2:$A$1000=Sheet2!$A2,ROW($A$1:$A$999)),COLUMN(A1)))) として、Shift+Ctrl+Enterキーです。 これを列方向と行方向にオートフィルでコピーすると 希望に近い形にならないでしょうか? 尚、数式はSheet1の1000行目まで対応できるようにしています。 以上、参考になれば幸いですが 他に良い方法があれば読み流してくださいね。m(__)m
- ASIMOV
- ベストアンサー率41% (982/2351)
- chuchuo
- ベストアンサー率45% (99/217)
関数では無理だと思います。 VBAでマクロを組んで実行するしか無いでしょう。
補足
お礼おそくなりまして大変申し訳ございません。 たくさんのご回答をいただきましたが、こちらの方法で作成したいと思います。 ありがとうございました。