Personally, I'd attack it another way, but that's obviously personal style
Option Explicit
Sub AnotherWay()
Dim aHave() As String
Dim rHave As Range, rPersons As Range, rComponents As Range, rPerson As Range, rComponent As Range
Dim i As Long
Application.ScreenUpdating = False
Set rHave = Worksheets("Sheet2").Cells(1, 1).CurrentRegion
Set rPersons = Worksheets("Sheet1").Cells(3, 2)
Set rPersons = Range(rPersons, rPersons.End(xlDown))
Set rComponents = Worksheets("Sheet1").Cells(3, 3)
Set rComponents = Range(rComponents, rComponents.End(xlDown))
ReDim aHave(1 To rHave.Rows.Count)
For i = LBound(aHave) To UBound(aHave)
aHave(i) = rHave.Cells(i, 1).Value & "-" & rHave.Cells(i, 2).Value
Next i
For Each rPerson In rPersons.Cells
For Each rComponent In rComponents.Cells
i = 0
On Error Resume Next
i = Application.WorksheetFunction.Match(rPerson.Value & "-" & rComponent.Value, aHave, 0)
On Error GoTo 0
If i = 0 Then
rPerson.End(xlToRight).Offset(0, 1).Value = rComponent.Value
End If
Next
Next
Application.ScreenUpdating = True
End Sub