A Textual Lookup
Сценарий, когда есть ошибка в ячейке, где мы хотим получить значение для строки, НЕ рассматривается. Все остальное должно быть в порядке.
В вашем случае вы должны поместить функцию в стандартный модуль, а в Excel для этого точного сценария используйте следующую формулу в ячейке E2 (и скопируйте вниз):
=TLU(C2,H$2:H$5,1)
Существует дополнительная функциональность, например, столбцы могут быть где угодно (слева, справа, посередине), разделитель может быть изменен (4-й аргумент по умолчанию ",") и чувствительность к регистру (5-й аргумент). Играй с ним.
Option Explicit
Function TLU(SourceValue As Variant, SourceColumn As Range, _
ValueColumnOffset As Long, Optional Separator As String = ", ", _
Optional CaseInSensitive As Long = 1) As String
Dim ValueColumn As Range ' Value Column
Dim vntS As Variant ' Source Array
Dim vntV As Variant ' Value Array
Dim colSource As Long ' SourceColumn Column Number
Dim colTC As Long ' ThisCell Column Number
Dim i As Long ' Source and Value Array Counter
Dim strS As String ' Source String
Dim strR As String ' Resulting String
' Calculate SourceColumn Number.
colSource = SourceColumn.Column
' Calculate Value Column and eliminate some impossible scenarios
' using error handling.
On Error GoTo ProcedureExit
Set ValueColumn = Cells(SourceColumn.Row, SourceColumn.Column) _
.Offset(, ValueColumnOffset).Resize(SourceColumn.Rows.Count)
On Error GoTo 0
' Calculate ThisCell Column Number
colTC = Application.ThisCell.Column
' Check ThisCell Column Number against SourceColumn Number and
' Value Column Number.
If colTC = colSource Or colTC = ValueColumn.Column Then Exit Function
' Write SourceValue to Source String and values of ranges to arrays.
strS = CStr(SourceValue): vntS = SourceColumn: vntV = ValueColumn
' Loop through arrays and build Resulting String.
For i = 1 To UBound(vntS)
If StrComp(CStr(vntS(i, 1)), strS, CaseInSensitive) = 0 Then
If strR <> "" Then
strR = strR & Separator & vntV(i, 1)
Else
strR = vntV(i, 1) ' First value has no separator.
End If
End If
Next
TLU = strR
ProcedureExit:
End Function