エクセルVBAを、どれほどこなせるレベルか知ら無いが、Dictionaryなどの凝った仕組みを使わずとも、普通のVBA(ソート法などで)簡単に出来るよ。Dictionaryの練習問題ならいざ知らず、ベテランはなるべく単純な使い慣れた仕組みを使うと思う。
Dictionaryを使いこなせるレベルなら、デバッグなど自力で出来る力が有るはずだ。
Googleででも「VBScript dictionary」で照会でもして、たくさん出る記事の適当なものを読みましたか。
ーーー
文字列を結合したKeyを作るとき、定桁結合式にしないと、おかしくなることが有ることを注意してますか。
ーーー
私の言うやり方でやってみる。
IFと代入しか使ってない。質問者は、他シート参照がなれているかな。
ただしロジックは易しいと思うが、先人のロジックで、長く使い続けて慣れた面はある。
例データ ソート後
日付 数 単位 単価 計 区分
3月12日 1 時間 2000 10000 残業
3月12日 2 人 10000 20000 通常
3月12日 1 人 10000 10000 通常
3月12日 4 人 10000 10000 通常
3月12日 2 人 10000 20000 通常
3月14日 4 時間 2000 8000 残業
3月14日 2 人 10000 20000 通常
3月15日 4 人 10000 40000 通常
3月15日 1 人 20000 20000 通常
3月15日 2 人 20000 20000 通常
ーー
コード
Sub test01()
Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("Sheet2")
Set sh2 = Worksheets("Sheet3")
d = sh1.Range("A65536").End(xlUp).Row
MsgBox d
k = 2: t1 = 0: t2 = 0
m1 = sh1.Cells(2, "A"): m2 = sh1.Cells(2, "C"): m3 = sh1.Cells(2, "D"): m4 = sh1.Cells(2, "F")
'---
For i = 2 To d
If sh1.Cells(i, "A") = m1 And sh1.Cells(i, "C") = m2 And sh1.Cells(i, "D") = m3 And sh1.Cells(i, "F") = m4 Then
t1 = t1 + sh1.Cells(i, "B")
t2 = t2 + sh1.Cells(i, "E")
Else
sh2.Cells(k, "A") = m1
sh2.Cells(k, "B") = t1
sh2.Cells(k, "C") = m2
sh2.Cells(k, "D") = m3
sh2.Cells(k, "E") = t2
sh2.Cells(k, "F") = m4
k = k + 1
m1 = sh1.Cells(i, "A"): m2 = sh1.Cells(i, "C"): m3 = sh1.Cells(i, "D"): m4 = sh1.Cells(i, "F")
t1 = sh1.Cells(i, "B")
t2 = sh1.Cells(i, "E")
End If
Next i
sh2.Cells(k, "A") = m1
sh2.Cells(k, "B") = t1
sh2.Cells(k, "C") = m2
sh2.Cells(k, "D") = m3
sh2.Cells(k, "E") = t2
sh2.Cells(k, "F") = m4
End Sub
ーーー
結果
日付 数 単位 単価 計 区分
2009/3/12 1 時間 2000 10000 残業
2009/3/12 9 人 10000 60000 通常
2009/3/14 4 時間 2000 8000 残業
2009/3/14 2 人 10000 20000 通常
2009/3/15 4 人 10000 40000 通常
2009/3/15 3 人 20000 40000 通常
第1行見出しは、元のシートの見出し行をコピー貼り付けする。
お礼
end-uさん。今戻りました。バッチリです。 しかしまだまだ ReDim w(1 To UBound(v, 1), 1 To UBound(v, 2))の部分が私にとって鬼門です。配列の要素数の再定義 この部分をしっかり理解しないと、一気に出来ず、Dictionaryを2回使ったりしなければならなくなりそうです。この部分を勉強させてもらいます。
補足
end-uさん最近はお世話になりっぱなしです。 全てend-uさんのおっしゃる通りです。じつは前回のコードで、keyを増やして key1 key2 key3 key4 集計1 集計2 日付 単位 単価 区分 数 計 の順で書き出した後に、列を入れ替えて書き出して動かしてました。(下記のコードで入れ替え。) vntData_2 = Columns("B").Value vntData_3 = Columns("C").Value vntData_4 = Columns("D").Value vntData_5 = Columns("E").Value vntData_6 = Columns("F").Value Columns("B").Value = vntData_5 Columns("C").Value = vntData_2 Columns("D").Value = vntData_3 Columns("E").Value = vntData_6 Columns("F").Value = vntData_4 しかし、少し時間(列入れ替え時)かかるのと、今回は入れ替えの無いパターンなので、前は作れたのに、時間が経って忘れてしまったのか、今回は単純なパターンなのにつまづいてしまったのは、基礎が、身に付いてなかったせいと思い、そこでまた皆様のお力をお借りしたのでした。本当に忘れないようにします。私は、出張が多いので、本当にお世話になりまくりのend-uさんには、何かお土産でも渡したいと思ってます(心から)なにかよい方法(メールアドレス等)でも教えてもらえれば幸いです。今また出かけなければならないので、ここのお礼は、後ほど必ずいたします。YOKOKAMA46