|
ichinose さん こんばんは。
>CollectionのItemに直接配列などを指定すると
>書き換えが出来ないため、Removeして再度 Addしなければなりません。
初めて、Collectionで集計しようとすると、まず、この部分で引っかかりましたね。
それで、やむなく、Removeして再度 Addすることに気づいたわけですが、
Collectionの登録順が狂うのも分って、いやでしたが、とりあえず集計させるのが先決
でした。
「Removeして再度 Addすること」の部分はもっと、スマートな方法がないかと思っていました。
>Itemとしてクラスで定義したオブジェクトを登録します。
>こうすると、オブジェクトのプロパティは変更ができます。
この方法、今回勉強させてもらいました。
ichinoseさんのコードを見て、
まず私のコードで、!!vnt(i, 1)!!のところは、CStr(vnt(i, 1))に
直さなければいけないことが分りました。訂正しておきます。
私がやっている仕事程度では、データ数が少ないので、これでも使用に耐えます。
Collectionを使いはじめの人にとっては、分りやすいかな?と思ったりしています。
On Error Resume Next
For i = 1 To UBound(vnt, 1)
'Collectionにkey ,Itemを追加
MyColl.Add Item:= _
Array(vnt(i, 1), vnt(i, 2), vnt(i, 3), vnt(i, 4), _
vnt(i, 5), vnt(i, 6), vnt(i, 7)), key:=!!vnt(i, 1)!!
If Err.Number <> 0 Then
'重複のとき
a = MyColl(!!vnt(i, 1)!!)
MyColl.Remove !!vnt(i, 1)!!
a(4) = a(4) + vnt(i, 5) '集計
a(5) = a(5) + vnt(i, 6)
a(6) = a(6) + vnt(i, 7)
MyColl.Add Item:=a, key:=!!vnt(i, 1)!!
End If
Err.Number = 0
Next
On Error GoTo 0
==============================
ichinoseさんのコードで、
On Error Resume Next '
Set col = New Collection
For i = 1 To UBound(vnt, 1)
Err.Clear
Set chk_exsist = col(CStr(vnt(i, 1))) <===A
If Err.Number <> 0 Then
Set cls = New Class1
With cls <==============B
.myarray(0) = vnt(i, 1)
.myarray(1) = vnt(i, 2)
.myarray(2) = vnt(i, 3)
.myarray(3) = vnt(i, 4)
End With
col.Add cls, CStr(vnt(i, 1))
End If
With col(CStr(vnt(i, 1))) <==============C
.myarray(4) = .myarray(4) + vnt(i, 5)
.myarray(5) = .myarray(5) + vnt(i, 6)
.myarray(6) = .myarray(6) + vnt(i, 7)
End With
Next i
の部分のC,Bは、よく見ると、私には、結構時間をかけて、理解しないと行けない部分ですね。(クラスモジュールの方はわかるのですが、標準モジュールで使いまわすのが・・)
この部分が、
>Itemとしてクラスで定義したオブジェクトを登録します。
>こうすると、オブジェクトのプロパティは変更ができます。
にあたるのかな。
Aの部分は、なるほどですね。
今回もたくさん勉強うさせてもらいました。やっぱり投稿してみるもんですね。
また、何かありましたら、よろしくお願いします。有難うございました。
|
|