こんにちは。
データが、300程度は、どちらかというと、関数が向いているような気がします。
ただ、VBAのお話も出ていましたので、少し、私も考えてみました。
元のデータの振り分けをコードで行っていたようですが、元のデータには、コードと内訳名が違っていましたので、やむを得ず、内訳名で振り分けすることにしました。
m = Application.Match(c.Offset(, 2).Value, uchiwakes, 0) + 1
内訳名 内訳名のリスト
本来は、数字で振り分けるのが確実です。
また、以下のプログラムは、すでに出来上がった表ですと、半分以下になるのですが、表の項目から作るので長くなりました。
'<標準モジュールでお使いください。>
Option Explicit
Sub 集計1()
Dim objDic1 As Object
Dim Sh2 As Worksheet
Dim dataRng As Range, c As Range, k As Variant
Dim uchiwakes As Variant, i As Long, j As Long
Dim myData(), n As Variant, m As Variant
'出力先
Set Sh2 = Worksheets("Sheet2")
'データの名前の範囲
Set dataRng = Range("A2", Range("A65536").End(xlUp))
'内訳名(おそらくコードで別けているはず)
uchiwakes = Array("飴", "ガム", "パン", "米", "?", "食器")
Set objDic1 = CreateObject("Scripting.Dictionary")
i = 1
'名前
For Each c In dataRng
If objDic1.Exists(c.Value) = False Then
objDic1.Add c.Value, i
i = i + 1
End If
Next c
With Sh2
j = 2 '次のシートの2行目書き出し
.Range("B1").Resize(, UBound(uchiwakes)).Value = _
uchiwakes
For Each k In objDic1.keys
.Cells(j, 1).Value = k
j = j + 1
Next k
'マトリックス並べ替え(Main)
For Each c In dataRng
n = Application.Match(c, objDic1.keys, 0) + 1
m = Application.Match(c.Offset(, 2).Value, uchiwakes, 0) + 1
If Not (IsError(n) Or IsError(m)) Then
.Cells(n, m).Value = c.Offset(, 3).Value
End If
Next c
End With
'Call 集計2 ''続けて行う場合は、これを外す
Set dataRng = Nothing
Set Sh2 = Nothing
End Sub
'飴とガムを集計するマクロ
Sub 集計2()
Dim Rng As Range, c As Range
'シートを選択(念のため)
Worksheets("Sheet2").Select
Set Rng = Range("B1", Range("B65536").End(xlUp))
Application.ScreenUpdating = False
'重複実行防止
If Rng.Cells(1, 1).Value = "お菓子" Then Exit Sub
Rng.Cells(1, 1).Value = "お菓子"
For Each c In Rng
If VarType(c) = vbDouble Then
c.Value = c.Value + c.Offset(, 1).Value
End If
Next c
Rng.Offset(, 1).EntireColumn.Delete
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
お礼
ありがとうございます。 夜中に必死で質問したので、見出しやコードがズレズレに張りいてしまったのに、見事に私の意図するものをあらわしてくれたこと感謝です。 SUMPRODUCT勉強します。 夜中にありがとうございました。頑張ります。