• 締切済み

日別の自動集計について

EXCEL2007を使用しています。 下記のような表1を日別で結果1のように集計をしたいのですがやり方を教えて頂けますと助かります。B列は月が変わると5月になるので可能であれば自動で表1から結果1に月が変わっても集計できたらと思っています。よろしくお願い致します。 表1                   結果1   A     B       C          月日   内容   男  女 1 家事  4月1日  男       4月1日  家事   2  2 家事  4月1日  男       4月1日  バイト  1 3 家事  4月2日  女       4月1日  旅行      1 4 バイト  4月1日  男       4月2日  家事      1 5 バイト  4月2日  女       4月2日  バイト      1 6 旅行  4月1日  女

みんなの回答

noname#204879
noname#204879
回答No.4

「ピボットテーブルを使用したことがなくて」とのことなので、どんなものかを(結果だけを)お目にかけます。 通常は上段図のようになるけど、お好みで下段図のように[並べ替え]することも可能です。

kkokuryou
質問者

補足

数式よりもピボットテーブルを使用した方が簡単というご指導頂きましたので勉強してピボットテーブルを使ってみたいと思います。EXCEL2007で列に月日、内容、性別のラベルを並べることができません。 もう少し勉強してみたいと思います。

回答No.3

ピボットテーブルを使えば、「更新する」をクリックするだけで完了する可能性があります。 バカげているとは思いますが数式希望ということなので D2セル 項目の連結 =A2&C2&"_"&B2 下へオートフィル E2セル 日付の数を数える =B2*10000+COUNTIF($B$2:B2,B2) 下へオートフィル G2セル 重複の処理 =INDEX($D$2:$D$9,SMALL(IF(MATCH($D$2:$D$9,$D:$D,0)=ROW($D$2:$D$9), ROW($D$2:$D$9)-1),ROW(G1))) [Ctrl]+[Shft] +[Enter] で確定、配列数式。{ }で挟まれる 下へオートフィル H2セル 日付の抜き出し =IF(ISERR(G2),"",IF(G2="_","",MID(G2,FIND("_",G2)+1,5)*1)) 下へオートフィル I2セル 日付を昇順に並び替え =IF(COUNT(H:H)<ROW(A1),"",SMALL(H:H,ROW(A1))) 下へオートフィル J2セル 内容の検索 =IF(I2="","",INDEX(A:A,MATCH(I2*10000+COUNTIF($I$2:I2,I2),E:E,0))) 下へオートフィル K2セル 集計 =IF($I2="","",SUMPRODUCT(($B$2:$B$9=$I2)*($A$2:$A$9=$J2)*($C$2:$C$9=K$1))) 右へ下へオートフィル

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

マクロが使えるのならお試し下さい。 【結果1】をG1セルに書き出します。 Sub Test()   Dim myDic As Object   Dim c As Range, myStr As String   Dim d As Variant, tmp As Variant   Dim i As Long   Set myDic = CreateObject("Scripting.Dictionary")   For Each c In Range("B1", Cells(Rows.Count, "B").End(xlUp))     myStr = c.Value & ";" & c.Offset(, -1)     If Not myDic.Exists(myStr) Then       If c.Offset(, 1).Value = "男" Then         myDic(myStr) = Array(1, "")       Else         myDic(myStr) = Array("", 1)       End If     Else       tmp = myDic(myStr)       If c.Offset(, 1).Value = "男" Then         tmp(0) = tmp(0) + 1       Else         tmp(1) = tmp(1) + 1       End If       myDic(myStr) = tmp     End If   Next   ReDim v(1 To myDic.Count, 1 To 4)   For Each d In myDic.keys     i = i + 1     v(i, 1) = Split(d, ";")(0)     v(i, 2) = Split(d, ";")(1)     v(i, 3) = myDic(d)(0)     v(i, 4) = myDic(d)(1)   Next   '結果1をG1セルに書き出します。   With Range("G1")     'G:J列を消去     .EntireColumn.Resize(, 4).ClearContents     .Resize(, 4).Value = Array("月日", "内容", "男", "女")     .Offset(1).Resize(i, 4).Value = v     .CurrentRegion.Sort _     Key1:=.Cells, Order1:=xlAscending, Header:=xlYes   End With   Set myDic = Nothing End Sub

  • viva123
  • ベストアンサー率41% (7/17)
回答No.1

集計の方法の一つですが、ピボットテーブルをつかえば 簡単に集計が出来ます ちょっと慣れていないと、とっつきにくいのですが・・・ データメニューのピボットテーブルとピボット・・・を選び 表1を範囲指定します。(範囲さえ指定していれば後は次へ次へと画面を進めていくと、 空の表とピボットテーブルのフィールドとが表示されます。このフィールドを空の表にドラッグします。) 行のフィールドに日付をドラッグしその右側に(同じ行フィールド)に内容をドラッグします。 列のフィールドに性別をドラッグ。 データアイテムに性別を再度ドラッグ。 すると自動的にデータの個数を集計します。 日ごとの集計がいらない場合は、 1つの日ごとの集計行の左端をクリックすると集計行のみが全て選択されます。 そこでショートカットメニュー(範囲指定した状態で、右ボタンクリック。) を出して表示しないにすると見やすくなりますよ! ピボットって使えると結構便利ですよ!

kkokuryou
質問者

お礼

ご回答有難うございます。ピボットテーブルを勉強中です。教えて頂いた「行のフィールドに日付をドラッグしその右側に(同じ行フィールド)に内容をドラッグします。」の操作がよくわかりません。 もう少し勉強してみます。

kkokuryou
質問者

補足

ご回答有難うございます。 ピボットテーブルを使用したことがなくて使おうとしてもよく分かりませんでした。 2段階の集計になってもよいので計算式を使ってやる方法があるといいのですが、計算式だと複雑になりますか? ピボットテーブルを使いこなせば簡単かもしれませんが別の方にも使って頂きたいので覚えてもらうのが大変かなと思っています。

関連するQ&A

専門家に質問してみよう