- 締切済み
集計表の作成(自動転記)
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 30246kiku
- ベストアンサー率73% (370/504)
おじゃまします > マクロを使用して作成する場合でも構いません。 という事なので、考えてみました。 以下に記述しますが、変更場所を局所化してみました。 変更する場所は vA = Array( _ Array("取引先"), _ Array("売上", "売上", ""), _ Array("売上(1)~(3)", "売上(1),売上(2),売上(3)", ""), _ Array("売上(1)~(3)-(4)", "売上(1),売上(2),売上(3)", "売上(4)"), _ Array("売上(2)", "売上(2),売上(3),売上(4)", ""), _ Array("売上(3)", "売上(3),売上(4)", ""), _ Array("売上(4)", "売上(1),売上(2),売上(3),売上(4)", "") _ ) の所だけです。 vA = Array( _ Array("取引先"), _ 部分は固定で、それ以降環境に合わせて変更していきます。 意味的には Array("売上(1)~(3)", "売上(1),売上(2),売上(3)", ""), _ なら、列見出しは「売上(1)~(3)」で、 「売上(1)」,「売上(2)」,「売上(3)」の3つを加算 (名称に出てくる文字列をカンマ区切りで) その後の "" で、減算するものをカンマ区切りで・・・ なければ "" Array("売上(1)~(3)-(4)", "売上(1),売上(2),売上(3)", "売上(4)"), _ は、売上(1),売上(2),売上(3)を加算して、売上(4)を減算 提示された図での設定では、 vA = Array( _ Array("取引先"), _ Array("売上", "売上", ""), _ Array("売上(2)", "売上(1),売上(2),売上(3)", "") _ ) とでも設定すれば良いのでしょうか? ※※ 投稿で○数字がカッコ数字に変わるみたいです Public Sub Samp1() Dim dic As Object, dicW As Object Dim vA As Variant, vD As Variant Dim vK As Variant, v As Variant Dim i As Long, j As Long, k As Long vA = Array( _ Array("取引先"), _ Array("売上", "売上", ""), _ Array("売上(1)~(3)", "売上(1),売上(2),売上(3)", ""), _ Array("売上(1)~(3)-(4)", "売上(1),売上(2),売上(3)", "売上(4)"), _ Array("売上(2)", "売上(2),売上(3),売上(4)", ""), _ Array("売上(3)", "売上(3),売上(4)", ""), _ Array("売上(4)", "売上(1),売上(2),売上(3),売上(4)", "") _ ) Application.ScreenUpdating = False Set dicW = CreateObject("Scripting.Dictionary") For i = 1 To UBound(vA) k = 1 For j = 1 To 2 For Each vK In Split(vA(i)(j), ",") v = dicW(vK) If (IsArray(v)) Then ReDim Preserve v(UBound(v) + 1) Else ReDim v(0) End If v(UBound(v)) = i * k dicW(vK) = v Next k = -1 Next Next Set dic = CreateObject("Scripting.Dictionary") vD = Range("A2", Cells(Rows.Count, "A").End(xlUp)).Resize(, 4) For i = 1 To UBound(vD) If (Not dic.Exists(vD(i, 1))) Then dic.Add vD(i, 1), CreateObject("Scripting.Dictionary") End If vK = dicW(vD(i, 2)) If (IsArray(vK)) Then For j = 0 To UBound(vK) k = Abs(vK(j)) v = dic(vD(i, 1))(k) If (Not IsArray(v)) Then ReDim v(1) If (vK(j) > 0) Then v(0) = v(0) + vD(i, 3) v(1) = v(1) + vD(i, 4) Else v(0) = v(0) - vD(i, 3) v(1) = v(1) - vD(i, 4) End If dic(vD(i, 1))(k) = v Next End If Next Worksheets.Add Cells(1, 1) = vA(0)(0) For i = 1 To UBound(vA) With Cells(1, i * 2) .Value = vA(i)(0) .Offset(, 1).Value = "販売数" End With Next i = 2 For Each vK In dic.Keys Cells(i, 1).Value = vK For Each v In dic(vK).Keys Cells(i, v * 2).Resize(, 2) = dic(vK)(v) Next i = i + 1 Next With Cells(1.1).CurrentRegion With .Rows(1) .Interior.ColorIndex = 15 .HorizontalAlignment = xlCenter End With .Columns(1).HorizontalAlignment = xlCenter .Borders.LineStyle = xlContinuous .EntireColumn.AutoFit End With Set dicW = Nothing Set dic = Nothing Application.ScreenUpdating = True End Sub ※ 処理対象はアクティブシートで、結果はシートを追加して表示します。 ※ 不具合/不都合あれば、修正してください。
- tom04
- ベストアンサー率49% (2537/5117)
続けてお邪魔します。 No.2の補足 >画像ではSheet2のB2セルに >=SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,$B$1) >こちらの条件で「売上」とすると、データ一覧から「売上」だけではなく、「売上高」を合算してしまいます。 前回の数式はSheet2のB1セルの項目名(売上)というものを SUMIFS関数の「条件範囲2」の「条件2」をSheet1のB1セル(項目名の「売上」)にしていました。 もしかして、Sheet2のB1セル項目名が「売上高」になっていませんか? それはさておき、「売上」だけを表示したい場合はSheet2のB2セルの数式を =SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,"売上") としてみてください。 ※ アップされている画像通りにSheet2の数値が表示されるためには Sheet1のB列が「売上」となっている行だと判断しての数式です。 (売上-A・売上-B などは除外します) 今度はどうでしょうか?m(_ _)m
- tom04
- ベストアンサー率49% (2537/5117)
No.1です。 補足の >「売上-○」とつくものが30個以近くある場合は・・・ について、 とりあえず前回の画像でSheet2のD・E列だけでやってみました。 一番簡単なのは作業用の列を設ける方法だと思います。 ↓の画像でSheet2に集計したいデータをG列に羅列しておきます。 そしてSheet1の作業列F2セルに =IF(COUNTIF(Sheet2!G:G,B2),1,"") という数式を入れフィルハンドルでずぃ~~~!っと下へコピー! これを利用して、Sheet2のD2セルに =SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$F:$F,1) という数式を入れ、となりのE2セルまでコピー → そのまま下へコピー! これで画像のような感じになります。 ※ 今回はSheet2のA・B列には手を加えていませんが、 (A・B列はSheet1の「取引先」別の「売上」と「販売数」だけを表示すれば良いと思いますので) A・B列も同様のコトをしたい場合は 作業列を増やすのが簡単だと思います。 ※ 作業列が目障りであれば非表示にしておきます。 こんな感じではどうでしょうか?m(_ _)m
補足
ご回答ありがとうございます。 何度も申し訳ありません。。 もう1点確認させてください。 >画像ではSheet2のB2セルに >=SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,$B$1) こちらの条件で「売上」とすると、データ一覧から「売上」だけではなく、「売上高」を合算してしまいます。 こちらは「売上」と完全に一致するデータのみ抽出することは可能でしょうか?
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 画像のある「売上(2)」の右側列「販売数」は何を表示させれば良いか判らないのですが、 とりあえず、売上(1)~売上(3)の「販売数」を表示するようにしてみました。 ↓の画像で左側が元データの「Sheet1」とし、右側の「Sheet2」に表示するとします。 画像ではSheet2のB2セルに =SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,$B$1) という数式を入れ、隣りのC2セルまでフィルハンドルでコピー! 続いてD2セルに =SUM(SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,"売上(1)"),SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,"売上(2)"),SUMIFS(Sheet1!C:C,Sheet1!$A:$A,$A2,Sheet1!$B:$B,"売上(3)")) という数式を入れこれも隣りのE2セルまでコピー! 最後にB2~E2セルを範囲指定 → E2セルのフィルハンドルで下へコピーすると 画像のような感じになります。 ※ 実際の計算がお示しの画像の数値と異なるので、間違っていたらごめんなさいね。m(_ _)m
補足
ご回答ありがとうございます。 大変助かりましたm(_ _)m 追加でご質問よろしいでしょうか? 名称の「売上-A」「売上-B」etc の合計値の計算式ですが、「売上-○」とつくものが30個以近くある場合は、上記のような計算式ですと、長くなってしまうので、該当する対象リストを作成し、参照し、集計対象とする方法はありますでしょうか?
お礼
ご回答ありがとうございます。 確認したところ、セル項目名が「売上高」となっていました。。 無事、データ抽出することが出来ました! ありがとうございますm(_ _)m