これを行う最も簡単な方法は、新しいリストを古いリストと同じワークシートに置くことだと思いました。これは、新しいリストを列Dに入れることを前提としています(newCol
参照)。
新しいブックを選択してその上の特定のシートを取得する場合は、新しいブックをどのように選択するかを知っておく必要があります(ファイルセレクタ、常に特定のファイルにありますか?選択されたもの、シート名となるものなど)。
Sub AddAndAppend()
Dim ws As Worksheet
Dim i As Long, j As Long
Dim origCol As Long, newCol As Long, startRow As Long
On Error GoTo ErrorHandler
'sets to the current worksheet
Set ws = ActiveSheet
'speeds up macro for longer lists
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'assumes a header row so starts on row 2
startRow = 2
'origcol is where the names are to start, newcol is where the names are in the new list
origCol = 1
newCol = 4
'loop through all the new names
For i = startRow To ws.Cells(ws.Rows.Count, newCol).End(xlUp).Row
'if name in new list is found in old list...
If WorksheetFunction.CountIf(ws.Range(ws.Cells(startRow, origCol), ws.Cells(ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row, origCol)), ws.Cells(i, newCol).Value) > 0 Then
'...find the name in the old list and combine the values
For j = startRow To ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row
If ws.Cells(j, origCol).Value = ws.Cells(i, newCol).Value Then
ws.Cells(j, origCol + 1).Value = ws.Cells(j, origCol + 1).Value + ws.Cells(i, newCol + 1).Value
Exit For
End If
Next j
Else
'...otherwise, add the new name to the end of the old list
ws.Cells(ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row + 1, origCol).Value = ws.Cells(i, newCol).Value
ws.Cells(ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row, origCol + 1).Value = ws.Cells(i, newCol + 1).Value
End If
Next i
'turns off speeding up
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox Err.Number & vbCr & Err.Description
Exit Sub
End Sub
ピボットテーブルを試しましたか? –