|
▼八家九僧陀 さん:
おはようございます
本件に限っては、Dictionaryを使わずとも、Hirofumiさんからでているコードのような処理、
あるいは、VBAを使わなくても、並び替え をした上で、データ->集計 で簡単に必要列の
個人別合計は取得できますので【いかんせん、実稼動させる期限がせまり余裕がなくあせっています。】
のであれば、手作業をお奨めします。
また、この集計をマクロ記録すれば、基本的なコードを取得できますのでそれをベースにブラッシュアップすれば
VBAによる実行もできるかと思います。
ただ、今後のことも含めて、Dictionaryを身に付けておきたいという目的であれば、それはそれとして
以下にコード案をアップします。
・Dictionaryは、処理効率は、かなり優れている。しかしながら、大量データの突合せ処理を
おこなう場合は、並び替え->ループによるマージロジック のほうが、より優れている。
(というか、圧倒的に優れている)
・一方、ループによるマージロジックは、コードそのものが、けっして平易ではなく、バグつぶしに
時間がかかることが多い。一方、Dictionaryは、いってみれば【ばかちょんカメラ】で、ロジックに
悩むこともほとんどなく、コード部品としては、むしろ、初心者向き。
・また、他の機能(たとえばFileSystemObject)と比べ、圧倒的にメソッドやプロパティが【少なく】
誰でも短期間に覚えることができるという利点もある。
・要素の格納という面では配列やCollectionに似ているが、要素の追加、上書き、取り出しにおいて
両者よりも簡単に扱える部分が多い。
以下のサンプル、転記先シートのタイトル行と、各列の書式はセット済みという前提です。
Sub Sample()
Dim dic As Scripting.Dictionary
'Microsoft Scrinting Runtime 参照設定済みでなければ
'Dim dic As Object
Dim i As Long
Dim id As String
Dim pcode As String
Dim v As Variant
Dim myA As Range
Set dic = New Scripting.Dictionary
'Microsoft Scrinting Runtime 参照設定済みでなければ
'Set dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
With Worksheets("支給台帳")
For i = 2 To .Range("C" & .Rows.Count).End(xlUp).Row
id = .Cells(i, "C").Value
pcode = .Cells(i, "D").Value
If Not dic.Exists(id) Then
dic(id) = Array(id, pcode, 0, 0, 0)
End If
v = dic(id)
v(2) = v(2) + .Cells(i, "CN").Value
v(3) = v(3) + .Cells(i, "CO").Value
v(4) = v(4) + .Cells(i, "BZ").Value
dic(id) = v
Next
End With
With Worksheets("年調データ")
Set myA = Intersect(.UsedRange, .UsedRange.Offset(1, 0))
If Not myA Is Nothing Then myA.ClearContents
Set myA = Nothing
.Range("A2").Resize(dic.Count, 5).Value = _
Application.Transpose(Application.Transpose(dic.Items))
End With
Set dic = Nothing
Application.ScreenUpdating = True
End Sub
|
|