Предположим, что для этого ответа мы используем лист 1. Структура листа 1:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Lastrow As Long
Dim cell As Range, rng As Range, rngResults As Range
Dim strSearch As String, strResults As String
With ThisWorkbook.Worksheets("Sheet1")
If Not Intersect(Target, .Range("D2")) Is Nothing Then
strSearch = Target.Value
Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
Set rng = .Range(.Cells(2, 1), .Cells(Lastrow, 1))
Set rngResults = .Range("E2")
For Each cell In rng
If strSearch = cell.Value Then
If IsEmpty(strResults) Then
strResults = cell.Offset(0, 1).Value
Debug.Print strResults
Else
strResults = strResults & "," & cell.Offset(0, 1).Value
Debug.Print strResults
End If
End If
Next
With rngResults.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Formula1:=strResults
End With
End If
End With
End Sub