• 締切済み

指定期間内のデータを別シートへ抽出

エクセルについて、あるデータから指定期間内のデータを別シートへ抽出する方法を教えてください。 例) No.  日付   名前  数字  配達先 1  5/1   AAA   5    BBB 2  5/6   CCC   10   DDD 3 5/14   EEE   4    FFF 4   6/6   GGG   20    HHH データは毎日更新されます。 ここであるセルに「2012/5/1」~「2012/5/31」と入力し、その期間内のデータを別シートへ引っ張りたいです。指定期間は人によってその都度様々です。 色々調べたのですが、オートフィルターでは行えそうになく、VBAを使用した方がよいと思ったのですが、初心者のため分かりません。どなたか教えていただけますと大変助かります

みんなの回答

noname#204879
noname#204879
回答No.5

》 オートフィルターでは行えそうになく、VBAを使用した方がよいと思った… “初心者”は先走って思い込まないことをお奨めします。 [オートフィルタ]で抽出したデータをコピーして、別シートに貼り付ける手もあります。 詳細な手順は省くけど、添付図は[フィルタオプションの設定]を利用した経過&結果を示しています。 [抽出先]    “指定した範囲” [リスト範囲]  Sheet1!$A:$E [検索条件範囲] $D$2:$D$3 [抽出範囲]   $A$5:$E$5

1414194kitotomo
質問者

お礼

お礼が遅くなり、申し訳ございません。 ご教示ありがとうございました。 確かに、一般的な機能を使いこなせていないのに、 マクロと先走らず勉強してみようと思います。 オートフィルターをうまく使いこなしてみます。

すると、全ての回答が全文表示されます。
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

シート1にはお示しの表が有り、A1セルからE1セルには項目名が有り、2行目以降にそれぞれのデータが入力されているとします。 シート2はお求めの表でA1セルには2012/5/1のように検索の初めの日付が、B1セルには から の文字が、C1セルには2012/5/30のように検索の終わりの日付が入力されているとします。 そこでシート1に戻ってシート1のF2セルには次の式を入力して下方にドラッグコピーします。 =IF(B2="","",IF(AND(B2>=Sheet2!A$1,B2<=Sheet2!C$1),MAX(F$1:F1)+1,"")) シート1のF列のデータをもとにシート2の表を作ります。 シート2のA2セルからE2セルまでのはシート1の1行目の項目名をコピーして貼り付けます。 シート2のA3セルには次の式を入力してE3セルまで横のドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(Sheet1!$F:$F),"",INDEX(Sheet1!$A:$E,MATCH(ROW(A1),Sheet1!$F:$F,0),COLUMN(A1))) 最後にシート2のB列を選択して右クリックしセルの書式設定からセルの表示形式で日付を選択します。

1414194kitotomo
質問者

お礼

お礼が遅くなり、申し訳ございません。 ご教示ありがとうございます。 関数を使うことが頭になかったので、 関数でもできることに驚きました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 作業列を使用しない方法です。  今仮に、元データの表中で「No.」と入力されているセルがSheet1のA1セルであり、Sheet2のB1セルに指定期間の最初の日付を入力し、Sheet2のD1セルに指定期間の最終日の日付を入力すると、Sheet2のA列~E列の4行目以下に、抽出されたデータが表示されるものとします。  又、Sheet1の日付は、必ず、古い日付が上になり、新しい日付が下に来るように並べられているものとします。  又、Sheet2のC1セルには「~」と入力されていて、例えば、Sheet1のB1セルに「2012/5/1」という日付が入力されていて、Sheet2のD1セルが空欄となっている場合には、指定期間は「2012/5/1~」という事で、2012/5/1以降の全てのデータが抽出されるものとし、 又、例えば、Sheet2のB1セルが空欄で、Sheet2のD1セルに「2012/5/31」と入力されている場合には、指定期間は「~2012/5/31」という事で、2012/5/31以前の全てのデータが抽出されるものとします。 (指定期間を1日分のみとする場合には、同一の日付を両方のセルに入力して下さい)  まず、Sheet2のA4セルに次の関数を入力して下さい。 =IF(ROWS($4:4)>IF(AND(ISNUMBER(1/DAY($D$1)),COUNTIF(Sheet1!$B:$B,"<"&$D$1+1)),MATCH($D$1+"23:59:59",Sheet1!$B:$B),IF(COUNT(Sheet1!$B:$B),MATCH(9E+99,Sheet1!$B:$B),0))-IF(AND(ISNUMBER(1/DAY($B$1)),COUNTIF(Sheet1!$B:$B,"<"&$B$1)),MATCH($B$1-"0:0:1",Sheet1!$B:$B),ROW(Sheet1!$B$1)),"",INDEX(Sheet1!$A:$A,IF(AND(ISNUMBER(1/DAY($B$1)),COUNTIF(Sheet1!$B:$B,"<"&$B$1)),MATCH($B$1-"0:0:1",Sheet1!$B:$B),ROW(Sheet1!$B$1))+ROWS($4:4)))  次に、Sheet2のB4セルに次の関数を入力して下さい。 =IF(ISNUMBER(1/(VLOOKUP($A4,Sheet1!$A:$E,MATCH(B$3,Sheet1!$A$1:$E$1,0),FALSE)<>"")),VLOOKUP($A4,Sheet1!$A:$E,MATCH(B$3,Sheet1!$A$1:$E$1,0),FALSE),"")  次に、Sheet2のB4セルをコピーして、Sheet2のC4~E4の範囲に貼り付けて下さい。  次に、Sheet2のB4~E4の範囲をコピーして、同じ列の5行目以下に貼り付けて下さい。  以上です。

1414194kitotomo
質問者

お礼

お礼が遅くなり、申し訳ございません。 ご教示ありがとうございました! 関数でも十分にできるんですね! 勉強になりました!

すると、全ての回答が全文表示されます。
回答No.2

VBA を使わないとできないという処理は確かにありますが、Excel の一般機能でできることを VBA で行っても、そのほうが有利と言える条件が揃っている場合を除いて、あまりお勧めしません。趣味としてはいいですが、実務的には簡単な処理がかえって手間がかかってしまうし、一般機能が使えていない人が VBA のコードをスラスラ書けるとも思えません。まずは Excel の基本的な機能を使いこなせるよう学びましょう。 ご要望のことは、オートフィルタでも問題なくできると思いますよ。添付図は、質問文の表を「2012/5/2~2012/5/15」という期間で絞り込んだ状態のものです。 別シートに保存したければ、絞り込んだ状態で表をコピーし、別シートに貼り付けるだけのことです。 例えば、「5/1」というセルにカーソルを置いた状態で、数式バーを見てみましょう。「2012/5/1」などと表示されているかと思います。セルでは「5/1」と表示されていても実際は年月日のデータであり、書式で「5/1」と表示させているだけだからです。そのセルに設定されている書式の確認は、右クリックの「セルの書式設定」の「表示形式」タブでできます。 「2012/5/1」といった年月日のうち年などが正しくないようなら、正しい年に書き換えておきましょう。数式バーをクリックまたはセルをダブルクリックで、部分的にも編集できます。 こうして年月日が正しくなっていれば、オートフィルタで狙いどおりに絞り込めます。その具体的な方法は、参考 URL を参照してください。Excel2003 と 2007 の両方で紹介されています。 Excel2007 では、参考 URL のページの図にある「日付フィルタ」という箇所をクリックすると、「指定の範囲内」というのが選べると思います。月単位での絞込みの場合は、チェックボックスでもできますね。

参考URL:
http://officetanaka.net/excel/function/tips/tips44.htm
1414194kitotomo
質問者

お礼

お礼が遅くなり、申し訳ありません。 ご丁寧にご教示頂きありがとうございます。 確かにマクロにこだわる理由はありませんね、、。 もっと一般機能について勉強してからにします!

すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

こんばんは。 添付図: シート1のA,B,C,D,E列に元データ。 手順: シート2のC1とC2に「2012/5/1」~「2012/5/31」と入力することにして。 A2セルに =IF(MEDIAN(Sheet1!B2,$C$1:$C$2)=Sheet1!B2,ROW(Sheet1!B2),"") と記入、下向けに沢山コピー E2セルに =IF(ROW(E1)>COUNT($A:$A),"",INDEX(Sheet1!A:A,SMALL($A:$A,ROW(E1)))) と記入、右に下にコピー。 まずは練習として回答の通りにまっさらエクセルに作成し、その通りにできるようになってから、改めてあなたの本番を作成してください。 #毎日5回は寄せられるご相談なので、誰が作成してもどこかで見たような回答になりますね。

1414194kitotomo
質問者

お礼

お礼が遅くなり、申し訳ありません。 教えてくださり、ありがとうございました! 色んな方法があるんですね。とても勉強になりました。

すると、全ての回答が全文表示されます。

関連するQ&A