クラスモジュールについて
下記のコードは型番別で数値1の平均値を型番別でC列に出すコードなのですが
もう一つ条件を増やしてD列の日付を2011年〇〇月〇〇日~2012年〇〇月〇〇日まで
といった感じで指定して平均値をだしたいのです。
重要なポイントなんですが、例えば下記データベースで2011年のすべてを対象とした場合
2011年で計算された平均値を2012年の方にも全く同じ数値になるようにしたいのです。
ぜひ、アドバイスお願いします。長文で申し訳ありません><
正解例
A B C D
型番 数値1 平均値 日付
1256 0.25 0.24 2011/1/1
1256 0.11 0.24 2011/3/2
1256 0.36 0.24 2011/5/3
2256 0.55 0.62 2011/10/4
2256 0.56 0.62 2011/11/5
2256 0.75 0.62 2011/12/6
1256 0.05 0.24 2012/2/1
1256 0.06 0.24 2012/4/2
1256 0.07 0.24 2012/6/3
2256 0.88 0.62 2012/9/4
2256 0.98 0.62 2012/11/5
2256 0.74 0.62 2012/12/6
不正解例
A B C D
型番 数値1 平均値 日付
1256 0.25 0.24 2011/1/1
1256 0.11 0.24 2011/3/2
1256 0.36 0.24 2011/5/3
2256 0.55 0.62 2011/10/4
2256 0.56 0.62 2011/11/5
2256 0.75 0.62 2011/12/6
1256 0.05 2012/2/1
1256 0.06 2012/4/2
1256 0.07 2012/6/3
2256 0.88 2012/9/4
2256 0.98 2012/11/5
2256 0.74 2012/12/6
' 標準モジュール
Public Sub 平均値()
Dim dct As Object
Dim bot As Long
Dim k As Variant
Dim r As Long
Dim itm As Class1
Set dct = CreateObject("Scripting.Dictionary")
bot = Cells(Rows.Count, "A").End(xlUp).Row
For r = 2 To bot
k = CStr(Cells(r, "A").Value)
If dct.Exists(k) Then
Set itm = dct(k)
Else
Set itm = New Class1
dct.Add k, itm
End If
itm.Sum Cells(r, "B").Value
Next
For r = 2 To bot
Cells(r, "C").Value = dct(CStr(Cells(r, "A").Value)).Avg()
Next
End Sub
' クラスモジュール(オブジェクト名「Class1」)
Private total As Double
Private cnt As Long
Public Sub Sum(ByVal v As Double)
total = total + v
cnt = cnt + 1
End Sub
Public Function Avg() As Double
Avg = total / cnt
End Function
補足
ありがとうございます。 HPは結構調べたんで、上のも見ましたが 本で体系的にまとめられたのがないかなぁって探していました。 よろしくお願いします。