• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルの関数でピボットテーブルのような集計)

エクセル関数でピボットテーブルのような集計が可能か

このQ&Aのポイント
  • エクセルの関数を使用して、ピボットテーブルのような集計を行いたい場合、5回の処理が必要になるため効率的ではありません。
  • 代わりに関数を使用する方法も考えられますが、結合の処理も考慮する必要があります。
  • より効率的な方法があれば教えていただきたいです。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

2007以降をお使いだと信じて(笑)。 図はかなり見辛いと思いますが、読み解いてください。 さて、図の通りA:O列におそらくお望みの通りのサンプルを用意しました。 順を追って。 まず、Q列に「作業列」を作成します。 1行目から順に見ていって、名前が初めて出てきたら行番号を返す内容の   Q2セル(式):=IF(COUNTIF($F$2:F2,F2)=1,ROW(),"") として、行方向にフィルしてあります。 ちなみにフィルすると   Q3セル(式):=IF(COUNTIF(F$2:$F3,F3)=1,ROW(),"") という式が入ると思われます(4行目以降の行も同様です。) で、抽出部分。 作業列を見て、数字がある行の「名前」を取ってきます。 つまり、   S2セル(式):=IF(COUNT(Q:Q)<ROW(A1),"",INDEX(F:F,SMALL(Q:Q,ROW(A1)))) として、行方向にフィルしてやります。 まぁ、ややこしいですが、なんとなく 「Q列に数字が入っていたら、F列から「名前」を持ってきてくれ」 くらいの認識で大丈夫です。 正確な内容を説明しだすと長くなりますので、それぞれの関数を別途お調べくださいませ。 T:X列及びY列はJ列についてのカウント部分です。 COUNTIFS関数を使って、カウントしてやると簡単です。 (2007以降、実装された関数です。)   T2セル(式):=IF($S2="","",COUNTIFS($F:$F,$S2,$J:$J,T$1)) としてやり、必要範囲(T:X)にフィルしてやります。 パッと見、ややこしい式に見えますが、結構簡単です。   =COUNTIFS(範囲1,条件1,範囲2,条件2・・・・・) といった具合に、「範囲・条件・範囲・条件・・・」と繰り返し、 複数条件によるカウントが可能な関数です。 これ以上の詳細は別途お調べください。 (IF関数については割愛します。) Y列は単純にSUM関数で合計を求めています。   Y2セル(式):=IF($S2="","",SUM(T2:X2)) 同様にZ:AD列及び、AE列は、M列に関する集計です。   Z2セル(式):=IF($S2="","",COUNTIFS($F:$F,$S2,$N:$N,Z$1)) で、必要セルにフィルです。 AE列は単純にSUM。   AE2(式):=IF($S2="","",SUM(Z2:AD2)) ですね。 2003以前のバージョンにはこのCOUNTIFS関数がありません。 なので、SUMPRODUCT関数を使って、   T2セル(式):=SUMPRODUCT(($F$2:$F$7=$S2)*($J$2:$J$7=T$1)) としてやります。 これも関数の仕組みを考え出すと長くなりますので、 詳細は別途お調べくださいませ。

Siam0710
質問者

お礼

御回答ありがとうございます。EXCELのバージョンは2007以降だと思います。Win8についてたもので、バージョンの調べ方が分かりません。リボンも使い辛く、ピボットテーブルもどこにあるのか分からず四苦八苦状態でした。まさか、本当に関数でできるとは思っていなかったので感謝です。ありがとうございました。

その他の回答 (4)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.5

> ピボットテーブルもどこにあるのか分からず四苦八苦状態 なるほど、そういうことでしたか。 WIN8パソコンについてきた、と言うことは2013でしょう(たぶん)。 まぁ、2010でも変わらないのですが、 「ピボットテーブル」はリボンの「挿入」タブの一番左にありますよ。

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

No2の回答の補足です。 ピボットテーブルのように、重複のない名前の一覧を関数で表示するなら、名前表示セルに以下のような数式を入力して下方向にオートフィルコピーしてください。 =INDEX(F:F,SMALL(INDEX((MATCH($F$2:$F$8&"",$F$2:$F$8&"",0)<>ROW($F$2:$F$8)-1)*1000+ROW($F$2:$F$8),),ROW(A1)))&""

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

作業列を作って対応するのが計算に負担のかからない方法としてお勧めです。 示しのようなデータがシート1の2行目から下方に入力されているとして作業列をQからV列に用意します。 Q2セルには次の式を入力して下方にドラッグコピーします。 =IF(F2="","",IF(COUNTIF(F$2:F2,F2)=1,MAX(Q$1:Q1)+1,"")) R2セルには次の式を入力して下方にドラッグコピーします。 =F2&J2 S2セルには次の式を入力してV2セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =$F2&L2 お求めの表をシート2に表示させるとして次のようにします。 A3セルには次の式を入力して下方にドラッグコピーします。 =IF(ROW(A1)>MAX(Sheet1!$Q:$Q),"",INDEX(Sheet1!$F:$F,MATCH(ROW(A1),Sheet1!$Q:$Q,0))) なめが表示されます。 1行目にはシート1での作業列の列記号を入力します。 B1セルのR、G1セルにS、M1セルにT、R1セルにU、W1セルにVと入力します。 2行目にはB2セルからE2セルまでに1,2,3,4、F2セルには計、G2セルからK2セルまでにはA・・・E、L2セルには計、M2セルからP2セルまでにはA,B,C,0、Q2セルには計、以下右横のセルかM2セルからQ2セルを繰り返してAA2セルまで入力します。 その後にB3セルには次の式を入力します。 =IF(OR($A3="",B$2=""),"",IF(B$2<>"計",COUNTIF(INDIRECT("Sheet1!"&INDEX($B$1:$AA$1,MATCH("ー",$B$1:B$1))&":"&INDEX($B$1:$AA$1,MATCH("ー",$B$1:B$1))),$A3&B$2),SUM(INDEX($B3:$AA3,MATCH("ー",$B$1:B$1)):A3))) この式で"ー"のーは必ず全角モードのひらがな入力による‐であることが必要で、一旦式を確定した後で-をーにけるなどの操作が必要となるでしょう。 その後に式をAA3セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。

Siam0710
質問者

お礼

御回答ありがとうございます。ばっちりできました。ただ、「"ー"のーは必ず全角モードのひらがな入力による‐であることが必要で、一旦式を確定した後で-をーにけるなどの操作が必要となるでしょう」の部分ですが、何も操作しないで正常に作動しています。全角の「"ー"」が正しい理由が良く分かりません。半角の「-」では#N/Aになります。EXCEL2013では、セルに単独で入れると全角と半角の違いが分かるのですが、関数内では同じに見えます。全角の「"ー"」が正しい理由を教えていただけると幸いです。関数組み合わせの内容もあまり分かっていませんが(笑)。

Siam0710
質問者

補足

御回答ありがとうございます。無事作動しているのですが、なぜ「"ー"」なのか?また、どういった仕組みで抽出しているのか、再度教えていただけにでしょうか、よろしくお願い致します。

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

ご使用のエクセルのバージョンが記載されていないので、ひとまず2007以降のバージョンでの計算方法を提示します。 また例示のデータと説明文の内容が少し違うように思いますが、各列のデータを添付画像のように集計したいなら、添付画像のJ列のデータを集計するG12セルに以下の数式を入力して右方向および下方向にオートフィルしてください。 =COUNTIFS($F$2:$F$7,$F12,$J$2:$J$7,G$11) ちなみに、L12セルにはJをMに変えた(上記の式を合計欄も無視して右方向にオートフィルした場合)、以下の関数を入力することになります。 =COUNTIFS($F$2:$F$7,$F12,$M$2:$M$7,L$11) ちなみに、空白セルにした各合計欄はそれぞれ列方向に選択し、ホームタブのオートSUMのΣボタンをクリックします。 #Officeソフトはバージョンによって使用できる機能や操作方法が大きく異なりますので、質問する際には必ずバージョンを明記するようにしましょう。

Siam0710
質問者

お礼

御回答いただき感謝です。私の質問の仕方が悪く、御迷惑をお掛けしました。

関連するQ&A