Excelの関数処理でデータ抽出と集計方法を教えてください

このQ&Aのポイント
  • ExcelでSheet1のデータを条件に基づいて抽出し、Sheet2に表示したいです。
  • また、Sheet1のデータを取引先ごとに集計し、Sheet3に表示したいです。
  • 関数またはVBAの方法を教えてください。よろしくお願いします。
回答を見る
  • ベストアンサー

Excelの関数処理教えてください

Excelでデータ抽出処理を以下のようにしたく、関数でできませんか? 1、Sheet1には以下のようなデータになっており、   同じ取引先のデータも含んでいます。   <取引先>  <商品名>   <数量>  <金額>  <重要フラグ>    A社   みかん     10    23,000    0    A社   もも      5    12,000    1    B社   ぶどう     3    8,000      1    C社   みかん     5    11,500    0    C社   バナナ     5    9,000     1    D社   すいか     8    21,500    0    D社   メロン     15    39,000     1 2、このSheet1のデータをSheet2に需要フラグ="1"のデータのみ抽出したいです。   Sheet2表の最下に合計行も追加した。 3、このSheet1のデータをSheet3に取引先毎に集計したデータを表示したいです。   Sheet3表の最下に合計行も追加した。  できれば関数でできればいいのですが、  何かよい方法はないでしょうか?よろしくお願いします。    関数でできなければ、VBAの標準モジュールでもやりたいですが、  どなたかご教授よろしくお願いします。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.9

>取引先毎に売上件数と売上金額の集計一覧がほしいです。  それは失礼しました。  それでしたら、Sheet4のC列から右側の作業列は必要御座いません。  ANo.4で数式を入力したSheet4のB列をそのまま使用します。  そして、Sheet3のA2セルに、次の数式を入力して下さい。 =IF(ROWS($1:2)>COUNT(Sheet4!$B:$B),IF(ROWS($1:2)=COUNT(Sheet4!$B:$B)+2,"合計",""),INDEX(Sheet1!$A:$A,SMALL(Sheet4!$B:$B,ROWS($1:2))))  次に、Sheet3のB2セルに、次の数式を入力して下さい。 =IF(ROWS($1:2)>COUNT(Sheet4!$B:$B),IF(ROWS($1:2)=COUNT(Sheet4!$B:$B)+2,COUNT(Sheet1!$C:$C),""),COUNTIF(Sheet1!$A:$A,$A2))  次に、Sheet3のC2セルに、次の数式を入力して下さい。 =IF(ROWS($1:2)>COUNT(Sheet4!$B:$B),IF(ROWS($1:2)=COUNT(Sheet4!$B:$B)+2,SUM(Sheet1!$D:$D),""),SUMIF(Sheet1!$A:$A,$A2,Sheet1!$D:$D))  次に、Sheet3のA2~C2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。

xin-jst
質問者

お礼

kagakusukiさん お蔭様で、Excel帳票がうまくできました。 どうもありがとうございました。 普段Excelは使うけれども、 関数とかマクロとかあまり触ってないので、 今回は大変勉強になりました。 感謝いたします。

その他の回答 (10)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.11

No10の回答の補足です。 Sheet1のA列に入力されている取引先の重複のないデータを関数で表示させるなら、以下のような数式をA2セルに入力して下方向にオートフィルしてください。 =INDEX(Sheet1!A:A,SMALL(INDEX((MATCH(Sheet1!$A$2:$A$100&"",Sheet1!$A$2:$A$100&"",0)<>ROW(Sheet1!$A$2:$A$100)-1)*1000+ROW(Sheet1!$A$2:$A$100),),ROW(A1)))&"" なお、この数式は計算負荷が高いので、データ範囲が大きかったり、表示データ数が多い場合には再計算に時間がかかりシートの動きが重くなるかもしれません。 その場合は、エクセルで最も便利な集計機能の一つであるピボットテーブルを使用することをお勧めします。 具体的には、行フィールドに取引先、データフィールドには取引先と金額をドロップしてみて下さい(表のレイアウトの修正もできます)。 #Officeソフトはバージョンによって使用できる機能や操作方法が大きく異なりますので(ピボットテーブルもExcel2007から大きく変更されました)、質問の際には必ずバージョンを明記するようにしましょう。 (

xin-jst
質問者

お礼

MackyNo1さん 熱心なご教授どうもありがとうございます。 kagakusukiさんの回答を参考して、 無事解決できました。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.10

>やりたいことは、 取引先毎に売上件数と売上金額の集計一覧がほしいです。 この場合は、最も基本的な関数であるCOUNTIF関数とSUMIF関数で表示できます。 B2セル(件数の集計) =IF(COUNTIF(Sheet1!A:A,A2)<ROW(A1),"",COUNTIF(Sheet1!A:A,A2)) C2セル(金額の集計) =IF(COUNTIF(Sheet1!A:A,A2)<ROW(A1),"",SUMIF(Sheet1!$A:A,A2,Sheet1!D:D)) 合計を自動表示するならNo2の回答と同じようにデータ数よりも1大きいセルに集計する関数をIF関数で表示するようにしてください。 =IF(COUNTIF(Sheet1!A:A,A2)+1<ROW(A1),"",IF(COUNTIF(Sheet1!A:A,A2)+1=ROW(A1),SUM($C1:C$2),元の式) #関数やVBAの回答を含めて、いろいろなパターンの回答が出ていますが、試されているのでしょうか? それぞれの回答には、条件によってメリット・デメリットがあると思いますが、もし不都合な点などがあれば返信のコメントを入れたほうが良いと思います。

回答No.8

データ数がある程度多い(5千~1万件くらい)場合として Sheet1!F列 作業列 Sheet1!F1 0 Sheet1!F2 =SUM(E2,INDEX(F:F,ROW()-1)) フィルハンドルダブルクリック 意味は =SUM(E2,F1) Sheet2!A列 作業列 Sheet2!A2セルに =IF(MAX(Sheet1!F:F)=ROW()-2,"合計",IF(MAX(Sheet1!F:F)<ROW()-2,"",MATCH(ROW()-2,Sheet1!F:F)+1)) 下へオートフィル Sheet2!B2セル =IF(ISNUMBER($A2),INDEX(Sheet1!A:A,$A2),"") 右へ下へオートフィル 数量のD2セル =IF(ISNUMBER($A2),INDEX(Sheet1!C:C,$A2),IF($A2="","",SUM(D$1:INDEX($D:$D,ROW()-1)))) 右へ下へオートフィル Sheet3はピボットテーブルを使えばよいと思います。 # OFFSET関数、SMALL関数、MATCHなどの検索系で完全一致は計算が重くなります

xin-jst
質問者

お礼

CoalTarさん 熱心なご教授どうもありがとうございます。 kagakusukiさんの回答を参考して、 無事解決できました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.7

関数のみで対応する方法です。シート1のデータは取引先ごとに整理されている必要もありません。 シート1はもとの表でA1セルからE1セルに項目名が有り、下行にそれぞれのデータがあるとします。 作業列のF列ではF2セルに次の式を入力して下方にオートフィルドラッグします。 =IF(OR(E2=0,E2=""),"",SUM(E$2:E2)) G2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",IF(COUNTIF(A$2:A2,A2)=1,INT(MAX(G$1:G1))+1.0001,INT(INDEX(G$1:G1,MATCH(A2,A:A,0)))+COUNTIF(A$2:A2,A2)/10000)) シート2ではA1セルからE1セルにはシート1と同じ項目名を入力します。 A2セルには次の式を入力してE2セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>MAX(Sheet1!$F:$F),"",INDEX(Sheet1!$A:$E,MATCH(ROW(A1),Sheet1!$F:$F,0),COLUMN(A1))) シート3でも同じように1行目に項目名を入力します。 A2セルには次の式を入力したのちにE2セルまでオートフィルドラッグし、その後に下方にもオートフィルドラッグします。 =IF(COUNTIF($A$1:$A1,"総合計")>0,"",IF(COUNTIF($A$1:$A1,"合計")=MAX(Sheet1!$F:$F),IF(COLUMN(A1)=1,"総合計",IF(COLUMN(A1)=2,"",IF(COLUMN(A1)=3,SUM(Sheet1!$C:$C),IF(COLUMN(A1)=4,SUM(Sheet1!$D:$D),IF(COLUMN(A1)=5,SUM(Sheet1!$E:$E),""))))),IF(OR(ROW(A1)=1,COUNTIF($A$1:$A1,$A1)<COUNTIF(Sheet1!$A:$A,$A1),$A1="合計"),INDEX(Sheet1!$A:$E,MATCH(COUNTIF($A$1:$A1,"合計")+1+IF(OR(ROW(A1)=1,$A1="合計"),0.0001,(COUNTIF($A$1:$A1,$A1)+1)/10000),Sheet1!$G:$G,1),COLUMN(A1)),IF(COUNTIF($A$1:$A1,$A1)=COUNTIF(Sheet1!$A:$A,$A1),IF(COLUMN(A1)=1,"合計",IF(COLUMN(A1)=2,"",IF(COLUMN(A1)=3,SUM(INDIRECT("C"&(ROW()-COUNTIF($A:$A,$A1))):$C1),IF(COLUMN(A1)=4,SUM(INDIRECT("D"&(ROW()-COUNTIF($A:$A,$A1))):$D1),IF(COLUMN(A1)=5,SUM(INDIRECT("E"&(ROW()-COUNTIF($A:$A,$A1))):$E1),""))))),"")))) これでそれぞれの取引先では合計が、また、最終行には総合計が表示されます。 取引先と取引先の間に合計が表示されみにくいですが、それを解消するためには表全体を選択したのちに「条件付き書式」の設定を行い数式によるセルの設定で数式の窓には =OR($A1="合計,$A1="総合計")  と入力し「書式」では「塗りつぶし」のタブで黄色などを指定してOKすればよいでしょう。

xin-jst
質問者

お礼

KURUMITOさん 熱心なご教授どうもありがとうございます。 kagakusukiさんの回答を参考して、 無事解決できました。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.6

>関数でできなければ、VBAの標準モジュールでもやりたい ⇒複数列項目のデータ抽出を関数で行う事は出来ないとは言いませんが非常の長い数式が必要になります。  このような作業はマクロ(VBAか、操作をマクロ記録)が適切と思う。  複雑な関数やVBAは荷が重いのであれば、フィルタオプションの設定をマクロ記録する方法があるが如何でしょうか。 ・データ抽出  (1)Sheet1の空き列(仮にG列)のG1に見出し名として重要フラグを入力、G2に1を入力     「フィルタオプションの設定」の  (2)マクロ記録開始→Sheet2のA1を選択フィルタオプションの設定→指定した範囲を選択、リスト範囲欄にSheet1!A:E、検索条件範囲欄にSheet1!G1:G2、抽出範囲欄にA1→OK→マクロ記録終了   因みにSheet1にはご例示の見出し名があるものとしていますので無ければ挿入して下さい。 ・データ集計  ピボットテーブルなら簡単に集計できますのでご検討下さい。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答番号ANo.4です。 【作業列を使わずに関数のみで行う方法】 ※但し、元データの表が数千行以上にもなりますと、計算処理に要する負荷が、非常に大きくなります。 まず、Sheet2のA2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNTIF(Sheet1!$E:$E,1),IF(ROWS($2:2)=COUNTIF(Sheet1!$E:$E,1)+2,"合計",""),INDEX(Sheet1!$A:$A,SUMPRODUCT(ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))*(INDEX(Sheet1!$E:$E,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$E:$E,MATCH(9^99,Sheet1!$D:$D))=1)*(COUNTIF(OFFSET(Sheet1!$E$1,,,ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))-ROW(Sheet1!$D$1)+1),1)=ROWS($2:2)))))  次に、Sheet2のB2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNTIF(Sheet1!$E:$E,1),"",INDEX(Sheet1!$B:$B,SUMPRODUCT(ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))*(INDEX(Sheet1!$E:$E,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$E:$E,MATCH(9^99,Sheet1!$D:$D))=1)*(COUNTIF(OFFSET(Sheet1!$E$1,,,ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))-ROW(Sheet1!$D$1)+1),1)=ROWS($2:2)))))  次に、Sheet2のC2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNTIF(Sheet1!$E:$E,1),IF(ROWS($2:2)=COUNTIF(Sheet1!$E:$E,1)+2,SUM(C$1:C1),""),INDEX(Sheet1!C:C,SUMPRODUCT(ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))*(INDEX(Sheet1!$E:$E,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$E:$E,MATCH(9^99,Sheet1!$D:$D))=1)*(COUNTIF(OFFSET(Sheet1!$E$1,,,ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))-ROW(Sheet1!$D$1)+1),1)=ROWS($2:2)))))  次に、Sheet2のC2セルをコピーして、Sheet2のD2セルに貼り付けて下さい。  次に、Sheet2のA2~D2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。  次に、Sheet3のA4セルに次の数式を入力して下さい。 =IF(ROWS($4:4)>COUNTIF(Sheet1!$A:$A,$B$1),IF(ROWS($4:4)=COUNTIF(Sheet1!$A:$A,$B$1)+2,"合計",""),INDEX(Sheet1!$B:$B,SUMPRODUCT(ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))*(INDEX(Sheet1!$A:$A,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$A:$A,MATCH(9^99,Sheet1!$D:$D))=$B$1)*(COUNTIF(OFFSET(Sheet1!$A$1,,,ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))-ROW(Sheet1!$D$1)+1),$B$1)=ROWS($4:4))))) 次に、Sheet3のB4セルに次の数式を入力して下さい。  次に、Sheet3のB4セルに次の数式を入力して下さい。 =IF(ROWS($4:4)>COUNTIF(Sheet1!$A:$A,$B$1),IF(ROWS($4:4)=COUNTIF(Sheet1!$A:$A,$B$1)+2,SUM(B$3:B3),""),INDEX(Sheet1!C:C,SUMPRODUCT(ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))*(INDEX(Sheet1!$A:$A,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$A:$A,MATCH(9^99,Sheet1!$D:$D))=$B$1)*(COUNTIF(OFFSET(Sheet1!$A$1,,,ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))-ROW(Sheet1!$D$1)+1),$B$1)=ROWS($4:4)))))  次に、Sheet3のD4セルに次の数式を入力して下さい。 =IF(ROWS($4:4)>COUNTIF(Sheet1!$A:$A,$B$1),"",INDEX(Sheet1!E:E,SUMPRODUCT(ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))*(INDEX(Sheet1!$A:$A,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$A:$A,MATCH(9^99,Sheet1!$D:$D))=$B$1)*(COUNTIF(OFFSET(Sheet1!$A$1,,,ROW(INDEX(Sheet1!$D:$D,ROW(Sheet1!$D$1)+1):INDEX(Sheet1!$D:$D,MATCH(9^99,Sheet1!$D:$D)))-ROW(Sheet1!$D$1)+1),$B$1)=ROWS($4:4)))))  次に、Sheet3のB4セルをコピーして、Sheet3のC4セルに貼り付けて下さい。  次に、Sheet3のA4~D4の範囲をコピーして、同じ列の5行目以下に貼り付けて下さい。  最後に、Sheet3のB1セルに A社 と入力して下さい。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

【関数と作業用シートを使用する方法】  今仮に、Sheet4を作業用シートとして使用するものとします。  まず、Sheet4のA1セルに次の数式を入力して下さい。 =IF(INDEX(Sheet1!$E:$E,ROW())=1,ROW(),"")  次に、Sheet4のB1セルに次の数式を入力して下さい。 =IF(COUNTIF(INDEX(Sheet1!$A:$A,ROW(Sheet1!$A$1)):INDEX(Sheet1!$A:$A,ROW()),INDEX(Sheet1!$A:$A,ROW()))=1,ROW(),"")  次に、Sheet4のC1セルに次の数式を入力して下さい。 =IF(COLUMNS($A:B)>COUNT($B:$B),"",INDEX(Sheet1!$A:$A,SMALL($B:$B,COLUMNS($A:B))))  次に、Sheet4のC2セルに次の数式を入力して下さい。 =IF(AND(C$1<>"",INDEX(Sheet1!$A:$A,ROW())=C$1),ROW(),"")  次に、Sheet4のA1~B1の範囲をコピーして、Sheet4のA2~B2の範囲に貼り付けて下さい。  次に、Sheet4のA2~C2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。  次に、Sheet4のC列全体をコピーして、C列よりも右にある列に貼り付けて下さい。  次に、Sheet2のA2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet4!$A:$A),IF(ROWS($2:2)=COUNT(Sheet4!$A:$A)+2,"合計",""),INDEX(Sheet1!$A:$A,SMALL(Sheet4!$A:$A,ROWS($2:2))))  次に、Sheet2のB2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet4!$A:$A),"",INDEX(Sheet1!$B:$B,SMALL(Sheet4!$A:$A,ROWS($2:2))))  次に、Sheet2のC2セルに次の数式を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet4!$A:$A),IF(ROWS($2:2)=COUNT(Sheet4!$A:$A)+2,SUM(C$1:C1),""),INDEX(Sheet1!C:C,SMALL(Sheet4!$A:$A,ROWS($2:2))))))))  次に、Sheet2のC2セルをコピーして、Sheet2のD2セルに貼り付けて下さい。  次に、Sheet2のA2~D2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。  次に、Sheet3のA4セルに次の数式を入力して下さい。 =IF(COUNTIF(Sheet4!$1:$1,$B$1),IF(ROWS($4:4)>COUNT(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1))),IF(ROWS($4:4)=COUNT(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1)))+2,"合計",""),INDEX(Sheet1!$B:$B,SMALL(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1)),ROWS($4:4)))),"")  次に、Sheet3のB4セルに次の数式を入力して下さい。 =IF(COUNTIF(Sheet4!$1:$1,$B$1),IF(ROWS($4:4)>COUNT(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1))),IF(ROWS($4:4)=COUNT(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1)))+2,SUM(B$3:B3),""),INDEX(Sheet1!C:C,SMALL(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1)),ROWS($4:4)))),"")  次に、Sheet3のD4セルに次の数式を入力して下さい。 =IF(COUNTIF(Sheet4!$1:$1,$B$1),IF(ROWS($4:4)>COUNT(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1))),"",INDEX(Sheet1!E:E,SMALL(OFFSET(Sheet4!$B:$B,,MATCH($B$1,Sheet4!$1:$1,0)-COLUMN(Sheet4!$B$1)),ROWS($4:4)))),"")  次に、Sheet3のB4セルをコピーして、Sheet3のC4セルに貼り付けて下さい。  次に、Sheet3のA4~D4の範囲をコピーして、同じ列の5行目以下に貼り付けて下さい。  最後に、Sheet3のB1セルに A社 と入力して下さい。

xin-jst
質問者

お礼

kagakusukiさん 早速のご教授ありがとうございます。 いま、書いて頂いた内容を勉強消化中です。 Sheet2の結果行けそうと思います。 Sheet3は私の質問の説明不足ですので、 やりたいことは、 取引先毎に売上件数と売上金額の集計一覧がほしいです。 例: 取引先  件数  金額 A社    2   35,000 B社    1   8,000 C社    2   20,500 ・・・・・・・ 合計   200    1,234,000     kagakusukiさんが教えって頂いた取引先毎の取引明細の抽出イメージはちょっと違います。 私の説明不足結果で、kagakusukiさんの貴重な時間を取られてしまって本当にすみません。 また、ご教授よろしくお願いします。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

標準モジュールに次のように記入し実行します。 言わずもがなですがシート1は  1行目にタイトル行,2行目から実データ  A列からデータ,都合E列がフラグ列 という配置に並べてから行ってください。 sub macro1()  dim r as long  worksheets("Sheet3").cells.clearcontents  worksheets("Sheet2").cells.clearcontents  worksheets("Sheet1").select ’重要フラグ(E列)が1のデータをコピー  range("E:E").autofilter field:=1, criteria1:=1  range("A:E").copy destination:=worksheets("Sheet2").range("A1") ’合計行の追加  with worksheets("Sheet2").range("D65536").end(xlup)  .offset(1).formular1c1 = "=SUM(R1C:R[-1]C)"  .offset(1, -2) = "合計"  end with ’取引先一覧を抽出しコピー  range("A:A").advancedfilter _   action:=xlfiltercopy, _   copytorange:=worksheets("Sheet3").range("A1"), _   unique:=true ’集計表の作成  worksheets("Sheet3").select  r = .range("A65536").end(xlup).row  range("B1") = "金額"  cells(r + 1, "A") = "合計"  cells(r + 1, "B").formular1c1 = "=SUM(R1C:R[-1]C)"  range("B2:B" & r).formula = "=SUMIF(Sheet1!A:A,A2,Sheet1!D:D)" end sub

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.2

>2、このSheet1のデータをSheet2に需要フラグ="1"のデータのみ抽出したいです。 関数で対応するなら以下のような数式をSheet2のA2セル(どのセルに入力する場合でも基本は同じ数式です)に入力し、右方向に4つ、下方向に適当数オートフィルします。 =IF(COUNTIF(Sheet1!$E$2:$E$10,1)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(INDEX(Sheet1!$E$2:$E$10*ROW($A$2:$A$10),),ROW(A1)+COUNTIF(Sheet1!$E$2:$E$10,"<>1")))) >Sheet2表の最下に合計行も追加した。 上記の数式は合計欄も空白になっていますので、C2セルを以下のように変更し右方向に1つ、下方向に適当数オートフィルしてください。 =IF(COUNTIF(Sheet1!$E$2:$E$10,1)+1<ROW(C1),"",IF(COUNTIF(Sheet1!$E$2:$E$10,1)+1=ROW(C1),SUM($C1:C$2),INDEX(Sheet1!C:C,SMALL(INDEX(Sheet1!$E$2:$E$10*ROW($A$2:$A$10),),ROW(C1)+COUNTIF(Sheet1!$E$2:$E$10,"<>1"))))) >3、このSheet1のデータをSheet3に取引先毎に集計したデータを表示したいです。 この場合もSheet3に以下のような数式を入力してください(A列のデータは必要ないのかな?)。 =IF(COUNTIF(Sheet1!$A$2:$A$10,"A社")<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(INDEX((Sheet1!$A$2:$A$10="A社")*ROW($A$2:$A$10),),ROW(A1)+COUNTIF(Sheet1!$A$2:$A$10,"<>"&"A社")))) 上記の数式を多用するとシートの動きが重くなりますので、会社名で抽出するシートは1枚にして、”A社”の部分をセル参照にして、この部分のセルを入力規則のリストを使ってドロップダウンリストから会社名を選択できるようにする(1枚のシートで処理する)ことをお勧めします。 同様に合計欄も数式もご自分で訂正してみてください。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 関数の方法での一例です。 ↓の画像(少し小さくて見づらいかもしれません)のようにSheet1に作業用の列を設けています(Sheet3に重複なしに抽出するため) Sheet2・Sheet3の1行目の各項目は入力してあるとします。 Sheet1の作業列F2セルに =IF(COUNTIF($A$2:A2,A2)=1,ROW(),"") という数式を入れオートフィルでずぃ~~~!っと下へコピーしておきます。 Sheet2のA2セルに =IF(COUNTIF(Sheet1!$E:$E,1)<ROW(A1),"",INDEX(Sheet1!A$1:A$100,SMALL(IF(Sheet1!$E$1:$E$100=1,ROW($A$1:$A$100)),ROW(A1)))) ※ これは配列数式になってしまいますので、この画面からSheet2のA2セルにコピー&ペーストする場合は A2セルに貼り付け後、数式バー内で一度クリック!編集可能になりますので Shift+Ctrlキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 これを列方向と行方向にオートフィルでコピーすると画像のSheet2のようになります。 続いてSheet3のA2セルに(どちらも配列数式ではありません!) =IF(COUNT(Sheet1!F:F)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(Sheet1!F:F,ROW(A1)))) B2セルに =IF(A2="","",SUMIF(Sheet1!A:A,A2,Sheet1!D:D)) としてA2・B2セルを範囲指定 → B2セルのフィルハンドルで下へコピー! これで画像のような感じになります。 ただし・・・ 最終行に合計の欄がほしいというコトですが、関数ではかなり難しいと思います。 VBAだと可能ですので、コードの一例も載せておきます。 この場合はSheet1の作業列は不要です。 Alt+F11キー → VBE画面が出ますので、画面左側の「This Workbook」をダブルクリックし、 ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (この場合もSheet2・Sheet3の1行目の項目はすでに入力済みだとしています。) Alt+F8キー → マクロ → マクロ実行です。 Sub test() 'この行から Dim i, j As Long Dim vl As Variant Dim ws1, ws2, ws3 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") Set ws3 = Worksheets("sheet3") i = ws2.Cells(Rows.Count, 1).End(xlUp).Row j = ws3.Cells(Rows.Count, 1).End(xlUp).Row If i > 1 Then Range(ws2.Cells(2, 1), ws2.Cells(i, 5)).Clear End If If j > 1 Then Range(ws3.Cells(2, 1), ws3.Cells(j, 2)).Clear End If For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = 1 To 5 If ws1.Cells(i, 5) = 1 Then ws2.Cells(Rows.Count, j).End(xlUp).Offset(1) = ws1.Cells(i, j) End If Next j Next i j = ws2.Cells(Rows.Count, 1).End(xlUp).Row With ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = "合計" .Offset(, 3) = WorksheetFunction.Sum(Range(ws2.Cells(2, 4), ws2.Cells(j, 4))) End With For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(ws3.Columns(1), ws1.Cells(i, 1)) = 0 Then ws3.Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws1.Cells(i, 1) End If Next i For j = 2 To ws3.Cells(Rows.Count, 1).End(xlUp).Row vl = 0 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, 1) = ws3.Cells(j, 1) Then vl = vl + ws1.Cells(i, 4) End If Next i ws3.Cells(j, 2) = vl Next j j = ws3.Cells(Rows.Count, 1).End(xlUp).Row With ws3.Cells(j + 1, 1) .Value = "合計" .Offset(, 1) = WorksheetFunction.Sum(Range(ws3.Cells(2, 2), ws3.Cells(j, 2))) End With End Sub 'この行まで こんな感じではどうでしょうか? どうも長々と失礼しました。m(_ _)m

xin-jst
質問者

お礼

tom04さん 丁念なご教授どうもありがとうございます。 kagakusukiさんの回答を参考して、 無事解決できました。

関連するQ&A

  • エクセルの関数

      A B C D E F 1 × 8/1 8/2 8/3 8/4 8/5 2 ○ 3 4 3 4 5 3 △ 0 1 4 3 2 4 ■ 6 0 2 1 2 5 □ 5 3 2 1 1 6 ● 3 4 2 1 2 上記の表がSheet1にあり sheet2 に ○の8/3の数値を抽出する関数がわかりません。 =SUMIF(Sheet1!A1:Sheet1!A6,"○",Sheet1!D1:Sheet1!D6) で抽出できるものの、日付が変わったとき対応が全く出来なくて行き詰ってしまいました。行、列ともに条件が必要だと思うのですが、どなたか教えて頂けると助かります。

  • エクセル2010の関数コピーについて

    エクセル2010でシート2~10にデータを入れ、シート1は取りまとめようとして一覧表を作り、シート2~10に入力したデータがコピーされるように関数を入れています。 シートを増やそうと思い、一覧表の行も増やし関数をコピーしようとしたのですが、通常2行目がシート2がコピーされるように関数が入っていたら、3行目にコピーすると自然とシート3がコピーされるように関数の数字も変わってくれますよね? それが変わらず、まったく同じ関数になってしまうのです。 他の人が作ったものから追加しようとしているので、何か設定しているのかも知れないのですが、まったくわかりません。 ちなみにコピーをするときは何もメッセージは出ません。どなたか教えてください。よろしくお願いします。

  • エクセル関数

    こんにちは。早速質問です。エクセルで以下のことが出来ますか? シート1に購入先(A)ごとに購入物(B)と購入地域(C)を表にしています。例、   A  B  C 1 甲社 みかん 愛媛 2 甲社 りんご 青森 3 乙社 本マグロ 青森 4 丙社 カキ 広島 このシート1をDBとしてシート2は日々購入したリストを作成 例   A   B   C   D  E 1 12/1 みかん 200個 () () 2 12/2 りんご 150個 () () 3 12/3 みかん 100個 () () 4 12/3 カキ  50個 () () 5 12/4 本マグロ 1本 () () このD列に先ほどのシート1から購入地域、E列に購入先が自動で入力される関数ありませんか?

  • エクセル シート名を参照する関数は?

    エクセルで、売上を管理しているファイルがあります。 4~3月までの各月ごとのシートに、取引先ごとの売上額・仕入額・原価率・担当者名etcが1行ずつ入力されてあります。 そして、担当者別シートで担当者ごとの取引先データをLOOKUP関数やINDEX関数を使って抽出・合計し、グラフ化して管理しています。 ↓こんな状態です。(合計額の表)    A   B  C  D  E F G 4月 50000 40000 80% ・・・・・ 5月 6月 今の状態では、5月になればA~Gまでの4月の列をコピペして LOOOKUP関数等で参照しているシート名「4月」を「5月」にひとつずつ入力しなおしています。 これが結構面倒なので、 セルに「5月」と入力したら、5月のシートを参照しにいく、 セルに「6月」と入力したら、6月のシートを参照しにいく・・・ というように作り直したいのですが、 このような、シート名を参照する関数はあるのでしょうか?

  • Excelでどのような関数を使えばいいでしょうか。

    関数について教えて下さい。 Excelで、同じBook内に以下のような2シートがあるときに、 (Sheet1)    A   B    C   D     1  1  あい   12  りんご 2     うえ   34  みかん   3     おか   56  イチゴ 4  1  おか   78  イチゴ (Sheet2)    A   B    C    D     1     あい   11   りんご 2     うえ   34   みかん   3     おか   78   イチゴ 4     うえ   34   みかん  Sheet2のA列にSheet1にあるデータを入れたいのです。 まず、列B,C,Dのそれぞれのデータが横に3つ一致するものを探して 横3つのデータが同じなら、Sheet2のA列に、 Sheet1のA列にあるデータをシートBにも持ってくる、 というようなイメージです。 (Sheet2)    A   B    C    D     1     あい   11   りんご 2     うえ   34   みかん   3  1  おか   78   イチゴ 4     うえ   34   みかん      ↑このようにしたいのです。 A列にどのような関数を入れればいいのでしょう。 (A列にあるのは1か空欄かのどちらかです。 同じ3つの組み合わせで、1の場合と空欄の場合両方があることはありません。) また、Sheet2には、A列に1とついた行に色を付けたいのです。 例えば、上記の例ですと Sheet2のB3:D3のセルに色をつけたいのです。 関数や条件付書式などで、できますでしょうか。

  • エクセルの関数についてです、よろしくお願いします

    エクセルの関数についてです、よろしくお願いします。 sheet1に以下の様なデータが何百行とあります。 A B C D E 日付  顧客名  品名  数量  金額 上記のsheet1のデータを基にsheet2へ抽出して転記する ものを作りたいと考えています。 具体的に言いますと sheet2のA1に2014/11/21、 B1に2014/12/20、 C1に ○○商店と入力するとその下に A      B     C     D 日付   品名   数量 金額 2014/11/23  りんご 5 750 2014/11/28  みかん 2 300 2014/12/2   いちご 3 600 2014/12/10  りんご 5 750 sheet1のリストから該当するものを引っ張ってきて sheet2へ表示させるものです オートフィルタ等でなく、関数で出来ないでしょうか お詳しい先生方よろしくお願いします。

  • エクセル関数 データの抽出について

    エクセル2010 重複データの抽出。 重複データの抽出方法をご教示ください。 抽出先はシート1のA列A3~抽出データの分だけ リストはシート2のB2:AB32まで フィルターオプションなども使ってみたのですが どうも上手くいきません。 どなたか知恵をお貸しください。 方法はできれば関数だといいのですが(データが増えてもいいように) できなければ他の方法でもいいです。 VBAなどは全くの初心者なので出来れば避けたいのですが… シート2     A    B   C    D~AB32 1  "" 2 いちご ばなな いちご りんご 3 みかん いちご ばなな いちご 4 りんご ばなな いちご みかん 5 みかん いちご ばなな りんご 6 ばなな ばなな りんご いちご : : 32 シート1(重複データなし)  A 1  "" 2  "" 3 いちご 4 みかん 5 りんご 6 ばなな 7 : : 抽出リストのデータはシート2のB2:AB32にぎっしり入っています。 宜しくお願い致します。

  • エクセル 2枚のシートの違いを抽出したい

    目を通していただきありがとうございます。 エクセルは全く詳しくないため、質問させていただきます。 sheet1とsheet2に各2000行ほどの表があります。 sheet1 A列(商品) B列(産地) C列(定価) D列(特価) E列(数量)  みかん    愛媛     100      80       500  みかん    静岡     120      85       400  オレンジ  アメリカ     150      90       100   sheet2 A列(商品) B列(産地) C列(定価) D列(特価) E列(数量)  みかん    愛媛     100      80       300  オレンジ  アメリカ     150     100       100  いちご     福岡     300     150       100  みかん    静岡     120      70       400 それぞれ「1行目のみかん」はA~D列まで同じ値で、E列のみの違いですので、 抽出の必要はありません。 sheet2の3行目のいちごはsheet1にはありませんので、これも抽出の必要はありません。 sheet1の2行目とsheet2の4行目のみかん、 sheet1の3行目とsheet2の2行目のオレンジ、はD列(特価)の違いがあります。 この<D列のみ違いがある>ものを行単位でsheet3に抽出したいのですが、 何か良い方法(関数等)がありましたら、教えていただけないでしょうか? なお、表題に「エクセル」と書きましたが、実際はKingsoftのSpreadsheets 2012を使用しています。 基本的な関数でしたらそのまま使えるようですので、エクセルとして書かせていただきました。 よろしくお願いいたします。     

  • エクセルの関数を教えてください。

    エクセルの関数について教えてください。 条件を満たした数を合計させる関数を教えてください。 たとえば果物屋さんで下記のような売上個数の表があったとします。        A       B     C     D 01行  4月01日  青森産  りんご   1個 02行  4月01日  秋田産  りんご   5個 03行  4月01日  新潟産  りんご   4個 04行  4月01日  青森産  みかん   3個 05行  4月01日  秋田産  レモン   4個 06行  4月01日  青森産  レモン   2個 07行  4月02日  青森産  レモン   1個 08行  4月02日  青森産  みかん   8個 09行  4月02日  秋田産  みかん   7個 10行  4月02日  秋田産  りんご   3個       ・       ・       ・       ・ 31行  4月31日  秋田産  りんご   2個 といった一ヶ月の売り上げ個数リストがあったとして 教えてほしい関数は、上記の中から ”青森産” の ”りんご” が 1日~31日 の間に 売れた数の合計を求める関数が知りたいのですがそんな関数はありますか? =SUMIF(C1:C31,"りんご",D1:D31)として『りんご』のみの合計の出し方はわかるのですが 『りんご』に『青森産』などといった複数の条件をつけた際の合計の方法がわかりません。 また、フィルター機能で青森産、りんごと絞り込んだ後での合計ではなく あくまで、関数で求める方法を教えていただけませんでしょうか?

  • Excelで[表1]にあって、[表2]にないものを抽出する関数

    Excelで[表1]にあって、[表2]にないものを抽出する関数 例)[表1]   [表2]    A社     A社    D社     D社    R社     P社    P社     R社    D社    F社    F社 上記は簡単に書きましたが、表1に重複するものも含め、300社程度あるなかで 表2にリストアップされていない会社を見つける関数やその他方法論があれば ぜひ教えてください! (例でいえば、F社を見つける方法です。) 抽出するのは別シートでも、同じシートでも構いません。 Excel2003でも対応できるものであれば、なお嬉しいです。 よろしくお願いします。

専門家に質問してみよう