|
▼kanabun さん:こんばんは!初めまして!
素晴らしいコードありがとうございました。
Dictionaryオブジェクト勉強します!!
kanabun さんのコードじっくり読みます!
ありがとうございました!!!
>▼やみ さん: こんにちは〜
>
>>A列とB列をKEYにしてC列〜J列の値をまとめて、重複してる文字を消したい
>
>すみません。ろくすっぽ、書かれたコード読んでませんが m(_ _)m
>こういう key別(A列+B列の項目別)にC列〜J列のデータをまとめる処理には
>Dictionaryオブジェクトを利用するのが手っ取り早いと思います。
>
>↓でやってることは、
>dicというDictionaryオブジェクトに各行の(A列+B列の)keyを格納していって
>・keyがはじめて出現したものだったら(if not dic.Exists(ss) then)
> 出力用配列の k行目にデータをコピーし、
>・すでに出現済みのkeyであれば、すでに出力してある行に、C列からJ列までの
> データを結合(または合計)していき、
>最後に Sheet2 にまとめた結果を出力する、
>というものです。
>
>Sub Try1()
> Dim dic As Object
> Set dic = CreateObject("Scripting.Dictionary")
>
> Dim vi, i As Long, j As Long
> Dim k As Long, n As Long
> Dim ss As String
>
> '元データはSheet1 と仮定
> With Worksheets(1)
> vi = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 10).Value
> End With
> ReDim vo(1 To UBound(vi), 1 To 10)
> For i = 1 To UBound(vi)
> ss = vi(i, 1) & vbTab & vi(i, 2)
> If Not dic.Exists(ss) Then
> k = k + 1
> dic(ss) = k
> For j = 1 To 10 '値のうめこみ(すべての列)
> vo(k, j) = vi(i, j)
> Next
> Else
> n = dic(ss)
> For j = 3 To 9 '文字列の結合
> If InStr(vo(n, j), vi(i, j)) = 0 Then
> vo(n, j) = vo(n, j) & "・" & vi(i, j)
> End If
> Next
> vo(n, 10) = vo(n, 10) + vi(i, 10)
> End If
> Next
> Set dic = Nothing
>
> 'Sheet2 に貼り付け (テストのため、別シートに結果を出力)
> With Worksheets(2)
> .UsedRange.ClearContents
> .Cells(1).Resize(, 10) = Worksheets(1).Cells(1).Resize(, 10).Value
> .Cells(2, 1).Resize(k, 10) = vo
> End With
>
>End Sub
>
>※なお、簡単のため、文字列がすでに書き込まれているかのチェックを
>非常に簡単な方法でチェックしています。
>
> If InStr(vo(n, j), vi(i, j)) = 0 Then
>
>たとえば
>出力用配列のある位置vo(n,j)に 「みかん・いも」とすでに書き込んであって
>いま vi(i,j) が「スイカ」だったとします。
>「みかん・いも」のなかには「スイカ」という文字列は見つかりませんから、
>"スイカ" はこれまでの文字列と結合されて 「みかん・いも・すいか」とな
>ります。
>ところが、チェックする文字列が仮に「かん」だったとしますと、
> InStr(vo(n, j), vi(i, j))
>は 2 を返しますから(「みかん・いも」の2文字目にマッチする)結果「かん」
>は追加されない、という不具合が発生します。
>上のコードは、こういう特殊ケースがありえないと仮定したコードです。
|
|