Только для S & G:
VBA не требуется, но я хотел поиграть с созданием базового UDF с использованием класса .Net System.Collections SortedList
.Это основано на предположении, что значения не повторяются в таблице (с точки зрения возврата правильного результата.).
Arg 1 rng1 - первый диапазон таблицы, исключая заголовки
Arg 2 rng2 - это второй диапазон таблицы, исключая заголовки
Arg 3 testValue - это строковое значение для проверяемого значения, имеющего совпадающий идентификатор для всех таблиц.Вы можете положиться на доступ к элементу по умолчанию, передав один диапазон ячеек или явно передав буквенную строку.
Option Explicit
Public Sub test()
Debug.Print MatchingKey([A2:B3], [D2:E3], [B3])
End Sub
Public Function MatchingKey(ByVal rng1 As Range, ByVal rng2 As Range, ByVal testValue As String) As Variant
Dim aList As Object, bList As Object, aArray(), bArray(), i As Long
If rng1.Columns.Count <> 2 Or rng2.Columns.Count <> 2 Then
MatchingKey = CVErr(xlErrNA)
Exit Function
End If
On Error GoTo errhand
Set aList = CreateObject("System.Collections.SortedList")
Set bList = CreateObject("System.Collections.SortedList")
aArray = rng1.value
bArray = rng2.value
For i = LBound(aArray, 1) To UBound(aArray, 1)
aList.Add aArray(i, 1), aArray(i, 2)
Next
For i = LBound(bArray, 1) To UBound(bArray, 1)
bList.Add bArray(i, 1), bArray(i, 2)
Next
If Not aList.ContainsValue(testValue) Or Not bList.ContainsValue(testValue) Then
MatchingKey = CVErr(xlErrNA)
Exit Function
End If
MatchingKey = aList.GetKey(aList.IndexOfValue(testValue)) = bList.GetKey(bList.IndexOfValue(testValue))
Exit Function
errhand:
MatchingKey = CVErr(xlErrNA)
End Function
Пример на листе: