質問にある添付図の構成でE列から右に出力します。(当方Excel2010です)
データ数が多いとのことなので、シートとのI/Oを減らし、Dictionaryオブジェクトを使い、短くしたつもりです。テストデータ1万件程度で1秒弱でした。
何回も行うと、E列より右に上書きするかもしれません。メッセージが出るので「OK」してください。最初、E列より右をクリアしておけばメッセージは出ません。
「D列に重複なしの氏名」ということを信用して、あまりエラー対応をしていません。ご容赦を。
シートのコードウィンドウに貼り付けます。
Sub TotalTest()
Dim myDic As Object 'Dictionaryオブジェクト
Dim myVal, myVal2 'シートの値
Dim i As Long, idx As Long 'カウンタ
'Dictionaryオブジェクト
Set myDic = CreateObject("Scripting.Dictionary")
'出力欄を取り込む
myVal = Range("D2", Range("D" & Rows.Count).End(xlUp)).Value
For i = 1 To UBound(myVal)
myDic.Add myVal(i, 1), i + 1
Next
'出力欄をクリアし確保(myValを再利用)
Range("E:E").ClearContents
myVal = Range("E2", "E" & UBound(myVal) + 1).Value
'データを取り込み振り分ける(メモリー上でカンマでつなげる)
myVal2 = Range("A2", Range("B" & Rows.Count).End(xlUp)).Value
For i = 1 To UBound(myVal2)
idx = myDic.Item(myVal2(i, 1)) - 1
If myVal(idx, 1) = "" Then
myVal(idx, 1) = myVal2(i, 2)
Else
myVal(idx, 1) = myVal(idx, 1) & "," & myVal2(i, 2)
End If
Next
'出力(カンマ区切り)
Range("E2", Range("E" & UBound(myVal) + 1)) = myVal
'セルに分割
Columns("E:E").Select
Selection.TextToColumns Destination:=Range("E1"), Comma:=True
Range("E1").Select
Set myDic = Nothing
End Sub
お礼
回答ありがとうございます。 お陰さまで一発で目的を果たせる事ができました。