[[20201124173436]] 『月別集計について』(kochan) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『月別集計について』(kochan)

お世話になります。

Sheet1にはA列に日付、B列以降は機械名・数量が20列ほど入っています。
また、5/30は2行発生するなど、行数も複数になる場合があります。

【Sheet1】

     A         B        C        D        E        F
1   日付    機械1    数量   機械2      数量
2   5/21    AAA     12    ABA      81
3   5/30    BBB     60    CCC      12
4   5/30    DFD     60    BBB      12
5   6/10    AAA     33    VVV      67

上記データをSheet2で月毎に集計したいのですが、5/21〜6/20が6月度、
6/21〜7/20が7月度というくくりで数量を集計ができないかと悩んでおります。

【Sheet2】

     A         B        C        D        E        F
1    月度    AAA    BBB   CCC      DFD
2    6月度    *     *    *      *
3    7月度    *     *    *      *
3    8月度    *     *    *      *
4    9月度    *     *    *      *

もし、B2に入れる関数で良い方法が在ればご教授いただければ幸いです。
どうぞよろしくお願い致します。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 シート2の1行目は、既に入力されているという前提でよろしいですか?
 シート1のF列に作業列
 F2=TEXT(EOMONTH(A2-20,1),"yy年mm月度")
 シート2の
 B2=SUMPRODUCT((Sheet1!$F$2:$F$100=$A2)*(((Sheet1!$B$2:$B$100=B$1)*Sheet1!$C$2:$C$100)+((Sheet1!$D$2:$D$100=B$1)*Sheet1!$E$2:$E$100)))
     |[A]    |[B]  |[C]   |[D]  |[E]      |[F]       |[G]   |[H]    
 [1] |日付   |機械1|数量  |機械2|数量     |年月      |検算  |       
 [2] |5月1日 |A    |    10|D    |   10,000|20年05月度|      |       
 [3] |5月10日|B    |   100|D    |   10,000|20年05月度|      |       
 [4] |5月20日|C    | 1,000|D    |   10,000|20年05月度|31,110|       
 [5] |5月21日|A    |    10|A    |       10|20年06月度|      |       
 [6] |5月30日|B    |   100|A    |       10|20年06月度|      |       
 [7] |5月31日|C    | 1,000|A    |       10|20年06月度|      |       
 [8] |6月1日 |D    |10,000|A    |       10|20年06月度|      |       
 [9] |6月10日|B    |   100|A    |       10|20年06月度|      |       
 [10]|6月20日|B    |   100|A    |       10|20年06月度|11,370|       
 [11]|6月21日|A    |    10|D    |   10,000|20年07月度|      |       
 [12]|6月30日|B    |   100|E    |  100,000|20年07月度|      |       
 [13]|7月1日 |C    | 1,000|F    |1,000,000|20年07月度|11,110|E,F除く

     |[A]       |[B]|[C]|[D]  |[E]   |[F]   
 [1] |          |A  |B  |C    |D     |検算  
 [2] |20年05月度| 10|100|1,000|30,000|31,110
 [3] |20年06月度| 70|300|1,000|10,000|11,370
 [4] |20年07月度| 10|100|1,000|10,000|11,110
 [5] |20年08月度|  0|  0|    0|     0|      
 [6] |20年09月度|  0|  0|    0|     0|      
 [7] |20年10月度|  0|  0|    0|     0|      
 [8] |20年11月度|  0|  0|    0|     0|      
 [9] |20年12月度|  0|  0|    0|     0|      
 [10]|21年01月度|  0|  0|    0|     0|      
 [11]|21年02月度|  0|  0|    0|     0|      
 [12]|21年03月度|  0|  0|    0|     0|      
 [13]|21年04月度|  0|  0|    0|     0|      

 でいかがでしょうか?
(稲葉) 2020/11/24(火) 18:31

 >B列以降は機械名・数量が20列ほど入っています。 
 ((Sheet1!$B$2:$B$100=B$1)*Sheet1!$C$2:$C$100)
 ↑このブロックを列数分作り、+でつなげてください。

 行数もできるだけ小さい範囲で可変してください。
 ((Sheet1!$B$2:$B$100=B$1)*Sheet1!$C$2:$C$100)
+((Sheet1!$D$2:$D$100=B$1)*Sheet1!$E$2:$E$100)
+((Sheet1!$F$2:$F$100=B$1)*Sheet1!$G$2:$G$100)
+((Sheet1!$H$2:$H$100=B$1)*Sheet1!$I$2:$I$100)
 てな具合で。

 これで計算が遅くなるようでしたら、列を行に直して集計しやすい表にすれば、ピボットテーブルで集計できると思います。
(稲葉) 2020/11/24(火) 18:49

 私がやるなら元となるデータを次のようにできないか、検討してみます。
 
	A	B	C	D
1	日付	機械	数量	月度
2	5月20日	AAA	12	5月度
3	5月21日	ABA	81	6月度
4	5月30日	BBB	60	6月度
5	5月30日	CCC	12	6月度
6	5月30日	DFD	60	6月度
7	5月30日	BBB	12	6月度
8	6月10日	AAA	33	6月度
9	6月10日	VVV	67	6月度
 
D2のセルには次の数式
=IF(DAY(A2)>20,MONTH(DATE(YEAR(A2),MONTH(A2)+1,1)),MONTH(A2))&"月度"
 
あとはピボットテーブルで次のような集計ができます。
 							
合計 / 数量	列ラベル						
行ラベル	AAA	ABA	BBB	CCC	DFD	VVV	総計
5月度	        12						12
6月度	        33	81	72	12	60	67	325
総計	        45	81	72	12	60	67	337

 

(みやほりん) 2020/11/24(火) 18:50


 >D2のセルには次の数式
 >=IF(DAY(A2)>20,MONTH(DATE(YEAR(A2),MONTH(A2)+1,1)),MONTH(A2))&"月度"

 ↓ でも同じ結果になると思います。
 =MONTH(EDATE(A2-20,1))&"月度"

 参考まで
(笑) 2020/11/24(火) 19:07

 もし元となるデータを変換できるのであれば、クエリで簡単にできると思います。
 項目名がかぶらない様に、
  機械1に対して、数量1
  機械2に対して、数量2など項目名を変更してあげて、下記のようなSQL組めばできるかと。
SELECT `Sheet1$`.日付, `Sheet1$`.機械1 , `Sheet1$`.数量1 
FROM `Sheet1$` WHERE `Sheet1$`.機械1 IS NOT NULL
UNION SELECT `Sheet1$`.日付, `Sheet1$`.機械2, `Sheet1$`.数量2
FROM `Sheet1$`  WHERE `Sheet1$`.機械2 IS NOT NULL
UNION SELECT `Sheet1$`.日付, `Sheet1$`.機械3, `Sheet1$`.数量3
FROM `Sheet1$`  WHERE `Sheet1$`.機械3 IS NOT NULL
UNION SELECT `Sheet1$`.日付, `Sheet1$`.機械4, `Sheet1$`.数量4
FROM `Sheet1$`  WHERE `Sheet1$`.機械4 IS NOT NULL

(稲葉) 2020/11/24(火) 19:19


Power Queryだと、こんな感じでできました。

 1)元データをテーブルに変換 ※見出しが勝手に変換されてしまいます
 2)そのテーブル名を、"月別データ"に変更
 3)空のクエリを作成し、詳細エディターに以下をコピペ
 4)「閉じて次に読み込む」で、シート2に、テーブル出力

 let
    ソース = Excel.CurrentWorkbook(){[Name="月別データ"]}[Content],
    ピボット解除された他の列 = Table.UnpivotOtherColumns(ソース, {"日付"}, "属性", "値"),
    追加されたインデックス = Table.AddIndexColumn(ピボット解除された他の列, "インデックス", 0, 1, Int64.Type),
    挿入された剰余 = Table.AddColumn(追加されたインデックス, "剰余", each Number.Mod([インデックス], 2), type number),
    ピボットされた列 = Table.Pivot(Table.TransformColumnTypes(挿入された剰余, {{"剰余", type text}}, "ja-JP"), List.Distinct(Table.TransformColumnTypes(挿入された剰余, {{"剰余", type text}}, "ja-JP")[剰余]), "剰余", "値"),
    並べ替えられた行 = Table.Sort(ピボットされた列,{{"インデックス", Order.Ascending}}),
    下方向へコピー済み = Table.FillDown(並べ替えられた行,{"0"}),
    削除された列 = Table.RemoveColumns(下方向へコピー済み,{"属性", "インデックス"}),
    フィルターされた行 = Table.SelectRows(削除された列, each [1] <> null and [1] <> ""),
    変更された型 = Table.TransformColumnTypes(フィルターされた行,{{"日付", type date}, {"0", type text}, {"1", Int64.Type}}),
    追加されたカスタム = Table.AddColumn(変更された型, "月度", each Date.ToText(Date.AddMonths(Date.AddDays([日付],-20),1), "yyyy年M月度")),
    削除された列1 = Table.RemoveColumns(追加されたカスタム,{"日付"}),
    ピボットされた列1 = Table.Pivot(削除された列1, List.Distinct(削除された列1[#"0"]), "0", "1", List.Sum)
 in
    ピボットされた列1

(マナ) 2020/11/24(火) 21:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.