| 
    
     |  | 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の部分は、なるほどですね。
 
 今回もたくさん勉強うさせてもらいました。やっぱり投稿してみるもんですね。
 また、何かありましたら、よろしくお願いします。有難うございました。
 
 |  |