[[20060721193005]] 『実績がないときは0といれて集計したい』(QP) ページの最後に飛ぶ

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

 

『実績がないときは0といれて集計したい』(QP)
 みなさま よろしくお願いいたします。

 グループ 	担当者	商品	売上
 グループ1	梅	A	1000
 グループ1	梅	B	 200
 グループ1	梅	C	5000
 グループ1	梅	D	 300
 グループ1	梅	E	 200
 グループ1	桃	A	 500
 グループ1	桃	B	 500
 グループ1	桃	D	7000
 グループ2	柿	C	1000
 グループ2	柿	D	3000
 グループ2	柿	E	5000
 グループ3	松	A	 100
 グループ3	松	B	 200

 この表を下記のように集計したく思っています。
 商品は5種類ですが担当者の実績がないところは0円といれて
 集計したいのです。
 グループには複数の担当者がいるところといないところがあります。

 グループ     担当者   商品  売上
グループ1	梅	A	1000
グループ1	梅	B	 200
グループ1	梅	C	5000
グループ1	梅	D	 300
グループ1	梅	E	 200
	合計		     6700
グループ1	桃	A	 500
グループ1	桃	B	 500
グループ1	桃	C	   0
グループ1	桃	D	7000
グループ1	桃	E	   0
	合計		     8000
合計			    14700
グループ2	柿	A	   0
グループ2	柿	B	   0
グループ2	柿	C	1000
グループ2	柿	D	3000
グループ2	柿	E	5000
	合計		     9000
合計			         9000
グループ3	松	A	 100
グループ3	松	B	 200
グループ3	松	C	   0
グループ3	松	D	   0
グループ3	松	E	   0
	合計		          300
合計			          300

 グループ、担当者、商品の欄を作って金額を入れるように式を作ってみたのですが
 担当者が増えたり減ったりが激しく、枠をつくるだけで
 大変な時間がかってしまいます。マクロしかないのでしょうか?
 どうぞ助言お願いいたします。


 ピボットテーブルではどうでしょうか。

 (川野鮎太郎)

 川野様

 お返事ありがとうございます。最初ピボットテーブルでしようと試みたのですが
 その月売上が無かった商品の欄を0円とすることができないのです。
 ピボットでも実績がない商品の欄が0円と表示できればそれでよいのですが
 過去ログをみたところできないようです。
 よろしくお願いいたします。


 元々、商品が5種類って決まっているのでしょうか。
 元のデータに0円のデータを書き込んでおけば良いのでは。

 (川野鮎太郎)


 川野様

 ありがとうございます。元々の商品の種類は決まっています。
 このデータは会社のシステムからエクセルに抽出しているのです。
 担当者の実績のないデータを探して0円を書き込むことは大変なのです。
 なぜなら担当が100人近くいるからです。
 よろしくお願いいたします。


 グループ名と、担当者名は相対関係がありますか。
 また商品名があらかじめ決まっているなら、商品の種類は何種類でしょうか。
 それから、元のデータが入っているシート名、セル番地を具体的に教えてください。

 (川野鮎太郎)

 川野様

 何度もありがとうございます。

  	A	    B 	C	D
1	グループ	    担当者	商品	売上
2	グループ1	梅	A	1000
3	グループ1	梅	B	200
4	グループ1	梅	C	5000
5	グループ1	梅	D	300
6	グループ1	梅	E	200
7	グループ1	桃	A	500
8	グループ1	桃	B	500
9	グループ1	桃	D	7000
10	グループ2	柿	C	1000
11	グループ2	柿	D	3000
12	グループ2	柿	E	5000
13	グループ3	松	A	100
14	グループ3	松	B	200

 商品の数はA〜Eの5種類、担当者はそれぞれの1つのグループに属しています。
 担当者が大勢いるところと一人しかいないところもあります。
 よろしくお願いいたします。


 マクロでやってみました。
 元のデータのシート名を Sheet1
 書き出し先のシート名を Sheet3に設定しています。 
※Sheet3は前もって空白のシートを用意しておいてください。
 商品名も具体的に不明なため、商品A 商品B ・・・ としています。
 
Option Explicit
Sub Test()
Dim Sh1 As Worksheet, Sh2 As Worksheet
Dim LastR As Long, i As Long, Rows_Count As Long
Dim n As Long, x As Long
Dim MyGoods_Name As Variant, MyGoods As Variant
Dim MyA() As Variant
Const MyCol As String = "H"             '作業列をH列に作成
Const Goods_Name_Count As Long = 5      '商品の種類
 
Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet3")
With Sh1
    Range(.Range("A1"), .Range("A65536").End(xlUp)).Resize(, 2).AdvancedFilter _
    Action:=xlFilterCopy, CopyToRange:=Sh2.Range(MyCol & "1"), Unique:=True
    Rows_Count = Range(Sh2.Range(MyCol & "1"), Sh2.Range(MyCol & "65536").End(xlUp)).Rows.Count
    MyGoods = Array("グループ名", "担当名", "商品", "売上")
    MyGoods_Name = Array("商品A", "商品B", "商品C", "商品D", "商品E")
    ReDim MyA(0 To (Rows_Count - 1) * Goods_Name_Count, 1 To 4)
    For n = 0 To UBound(MyGoods)
        MyA(0, n + 1) = MyGoods(n)
    Next n
End With
With Sh2
    For i = 1 To UBound(MyA())
        For x = 1 To 2
            MyA(i, x) = .Range(MyCol & "1").Offset(Int((i - 1) / 5) + 1, x - 1)
        Next x
            MyA(i, 3) = MyGoods_Name((i - 1) Mod 5)
            MyA(i, 4) = ""
    Next i
    .Range("A1").Resize(UBound(MyA()) + 1, UBound(MyGoods) + 1).Value = MyA()
    .Columns(MyCol).Resize(, 2).ClearContents
    .Range("D2:D" & UBound(MyA()) + 1).Formula = _
        "=SUMPRODUCT((Sheet1!B$2:B$14=B2)*(Sheet1!C$2:C$14=C2),Sheet1!D$2:D$14)"
    .Range("D2:D" & UBound(MyA()) + 1).Copy
    .Range("D2:D" & UBound(MyA()) + 1).PasteSpecial Paste:=xlPasteValues
End With
Erase MyGoods
Erase MyGoods_Name
Erase MyA
Set Sh1 = Nothing
Set Sh2 = Nothing
End Sub

 あとはピボットテーブルで出来ると思います。

 (川野鮎太郎)


 河野様

 ありがとうございました!できました。
 すばらしいです!

 そして申し訳ないのですがもう1点教えていただいてもよろしいでしょうか?
 現在は商品は5種類ですが、この種類が増えた場合

 商品の数を10個にし
 Const Goods_Name_Count As Long = 10      '商品の種類

 ここで商品の名前を増やし
 MyGoods_Name = Array("商品A", "商品B", "商品C", "商品D", "商品E","商品F","商品G","商品H","商品I","商品J")

 1から10まで数える
 ReDim MyA(0 To (Rows_Count - 1) * Goods_Name_Count, 1 To 10)

 そのあとここの部分の直し方がわからないのですが

    For i = 1 To UBound(MyA())
        For x = 1 To 2
            MyA(i, x) = .Range(MyCol & "1").Offset(Int((i - 1) / 5) + 1, x - 1)
        Next x
            MyA(i, 3) = MyGoods_Name((i - 1) Mod 5)
            MyA(i, 4) = ""
    Next i
 
 何度も申し訳ないのですがよろしくお願いいたします。


 簡単に修正できるようにしていたつもりですが、いくつか対応不足でしたね(^_^A;
 以下のコードに変えてみてください。
Option Explicit
Sub Test()
Dim Sh1 As Worksheet, Sh2 As Worksheet
Dim LastR As Long, i As Long, Rows_Count As Long
Dim Sh1_Rows_Count As Long
Dim n As Long, x As Long
Dim MyGoods_Name As Variant, MyGoods As Variant
Dim MyA() As Variant
Dim Goods_Name_Count As Long
Const MyCol As String = "H"             '作業列をH列に作成
Set Sh1 = Worksheets("Sheet1")
Set Sh2 = Worksheets("Sheet3")
With Sh1
    Sh1_Rows_Count = Range(.Range("A1"), .Range("A65536").End(xlUp)).Rows.Count
    Range(.Range("A1"), .Range("A65536").End(xlUp)).Resize(, 2).AdvancedFilter _
    Action:=xlFilterCopy, CopyToRange:=Sh2.Range(MyCol & "1"), Unique:=True
    Rows_Count = Range(Sh2.Range(MyCol & "1"), Sh2.Range(MyCol & "65536").End(xlUp)).Rows.Count
    MyGoods = Array("グループ名", "担当名", "商品", "売上")
    MyGoods_Name = Array("商品A", "商品B", "商品C", "商品D", "商品E")
    Goods_Name_Count = UBound(MyGoods_Name) + 1
    ReDim MyA(0 To (Rows_Count - 1) * Goods_Name_Count, 1 To 4)
    For n = 0 To UBound(MyGoods)
        MyA(0, n + 1) = MyGoods(n)
    Next n
End With
With Sh2
    For i = 1 To UBound(MyA())
        For x = 1 To 2
            MyA(i, x) = .Range(MyCol & "1").Offset(Int((i - 1) / Goods_Name_Count) + 1, x - 1)
        Next x
            MyA(i, 3) = MyGoods_Name((i - 1) Mod Goods_Name_Count)
            MyA(i, 4) = ""
    Next i
    .Cells.ClearContents
    .Range("A1").Resize(UBound(MyA()) + 1, UBound(MyGoods) + 1).Value = MyA()

    .Range("D2:D" & UBound(MyA()) + 1).Formula = _
        "=SUMPRODUCT((Sheet1!B$2:B$" & Sh1_Rows_Count & "=B2)*(Sheet1!C$2:C$" & _
        Sh1_Rows_Count & "=C2),Sheet1!D$2:D$" & Sh1_Rows_Count & ")"
    .Range("D2:D" & UBound(MyA()) + 1).Copy
    .Range("D2:D" & UBound(MyA()) + 1).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Application.Goto .Range("A1")
End With
Erase MyGoods
Erase MyGoods_Name
Erase MyA
Set Sh1 = Nothing
Set Sh2 = Nothing
End Sub

 これだと、MyGoods_Name = Array("商品A", "商品B", "商品C", "商品D", "商品E") だけを
 追加または削除していけば対応可能になると思います。

 (川野鮎太郎)

 川野 様
 できました!本当にありがとうございます。


コメント返信:

[ 一覧(最新更新順) ]


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