#excel
#excel
Вопрос:
Я пытаюсь создать формулу, которая показывает все совпадающие поля, но в дополнение включает «связанные ячейки». Что-то вроде этого —
Пользователь вводит «Брэд», и в окне результата должно отображаться «Брэд, Адам, Чарли, Дэвид», потому что Брэд связан с Адамом, а Адам связан с Чарли и Дэвидом.
A B
Adam|Brad
Adam|Charlie
Adam|David
Evan|Fred
Формула:
{IFERROR(IFERROR(INDEX(Column B,SMALL(IF(Column A=InputCriteria,ROW(Column A)-1),ROW(1:1))),INDEX(Column A,SMALL(IF(Column B=InputCriteria,ROW(Column B)-1),ROW(1:1)))),"")}
Комментарии:
1. Может ли пользователь вводить значение из столбца A? В данном случае «Адам», а затем вы также хотите сопоставить все Брэды, Чарли и Дэвиды в столбце B?
Ответ №1:
Меня зовут Брэд, поэтому я ничего не мог с собой поделать, мне пришлось попробовать решение. 🙂
Добавьте следующий код в новый модуль в вашем редакторе VBA…
Public Function GetAssociatedNames(ByVal strName As String, ByVal rngCells As Range) As String
Dim lngRow As Long, lngCol As Long, lngBlanks As Long, objNames As Scripting.Dictionary
Dim strName1 As String, strName2 As String, i As Long, strNameToAdd As String, x As Long
Dim lngStart As Long, lngCount As Long, lngForCount As Long
strName = Trim(strName)
Set objNames = New Scripting.Dictionary
objNames.Add strName, strName
With rngCells
lngStart = 0
Do While True
lngForCount = objNames.Count - 1
If lngStart > lngForCount Then Exit Do
For x = lngStart To lngForCount
strName = objNames.Keys(x)
lngCount = objNames.Count
For lngRow = 1 To .Rows.Count
strName1 = .Cells(lngRow, 1)
strName2 = .Cells(lngRow, 2)
If strName1 amp; strName2 = "" Then
lngBlanks = lngBlanks 1
Else
lngBlanks = 0
If strName1 = strName Then strNameToAdd = strName2
If strName2 = strName Then strNameToAdd = strName1
If Not objNames.Exists(strNameToAdd) And strNameToAdd <> "" Then objNames.Add strNameToAdd, strNameToAdd
End If
If lngBlanks = 10 Then Exit For
Next
lngStart = lngStart 1
Next
Loop
End With
For i = 0 To objNames.Count - 1
GetAssociatedNames = Trim(GetAssociatedNames amp; "," amp; objNames.Keys(i))
Next
GetAssociatedNames = Replace(Mid(GetAssociatedNames, 2), ",", ", ")
End Function
… затем добавьте ссылку на среду выполнения сценариев Microsoft Scripting …
Затем вы можете использовать формулу в ячейке, например, таким образом …
У меня это сработало, и я надеюсь, что у вас это сработает.
Комментарии:
1. Я ценю это, мистер Брэд! Я больше искал ответ формулы Excel с использованием массивов, но это тоже отлично работает. Еще раз спасибо!
2. Я только что понял, что это работает, только если поиск начинается с поля в левом столбце. Если критерии поиска начинаются с поля в правом столбце, он не получает всех совпадений. Если кто-нибудь может помочь, это было бы здорово. если нет, я попытаюсь решить и сообщить об этом. Спасибо
3. @DavidG Позвольте мне разобраться в этом. Я вернусь к вам.
4. @DavidG на самом деле, могу ли я просто подтвердить, что вы использовали тот же регистр, что и в списке? Т.е. john и John разные. Глядя на это (только с моего мобильного), он чувствителен к регистру.
5. Таким образом, вы действительно получаете результат «Брэд, Адам, Чарли, Дэвид, Фред, Эван»? Я получаю «Брэд, Адам, Эван»