как вариант, цикл в цикле. Типо перебор всех элементов первой таблицы по столбцу С, сравниваем со всеми элементами Второй таблицы столбца 1. Сравнивайте хоть через InStr (так проще). Или находите длинну значения в ячейке С, далее через Left и найденной длины значение в ячейке А сравниваем. Далее при совпадении значений Добавляем значения из нужного диапазона, в противном случае, находим первую не пустую ячейку в столбце С и вставляем туда всю строку из второй таблицы. Закончить цикл, закончить цикл. Я бы как то так сделал. Только сначала все это лучше в массив загнать. То есть значения из ячейки С и значения из значейки А во второй. И сравнивать непосредственно массивы, и только потом уже значения из таблицы в другую таблицу перекидывать, что бы время работы макроса сократить. Что то похожее вот в этом примере я описывал. У вас алгаритм такой же будет, только условие поиска как я писал выше изменить. My WebPage
как вариант, цикл в цикле. Типо перебор всех элементов первой таблицы по столбцу С, сравниваем со всеми элементами Второй таблицы столбца 1. Сравнивайте хоть через InStr (так проще). Или находите длинну значения в ячейке С, далее через Left и найденной длины значение в ячейке А сравниваем. Далее при совпадении значений Добавляем значения из нужного диапазона, в противном случае, находим первую не пустую ячейку в столбце С и вставляем туда всю строку из второй таблицы. Закончить цикл, закончить цикл. Я бы как то так сделал. Только сначала все это лучше в массив загнать. То есть значения из ячейки С и значения из значейки А во второй. И сравнивать непосредственно массивы, и только потом уже значения из таблицы в другую таблицу перекидывать, что бы время работы макроса сократить. Что то похожее вот в этом примере я описывал. У вас алгаритм такой же будет, только условие поиска как я писал выше изменить. My WebPageKamikadze_N
Сообщение отредактировал Kamikadze_N - Четверг, 09.02.2017, 09:45
Sub sFind() Dim ArrC() As String Dim ArrA() As String
xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" K = K + 1 ReDim Preserve ArrC(1 To K) ArrC(K) = Worksheets("article_all_5").Cells(xRow, 3)
xRow = xRow + 1 Loop
xRow = 2 Application.ScreenUpdating = False Application.Calculation = xlManual 'xlCalculationManual Workbooks.Open ThisWorkbook.Path & "\table_02" Do While Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(xRow, 1) <> "" N = N + 1 ReDim Preserve ArrA(1 To N) ArrA(N) = Worksheets("article_all_6").Cells(xRow, 1) xRow = xRow + 1 Loop
For i = 1 To K For j = 1 To N If ArrC(i) = Left(ArrA(j), Len(ArrC(i))) Then Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(i+1, Например 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(j+1, 5) 'и так сколько угодно строк с соответствующими столбцами одного листа другому ... End Sub
[/vba] вот как то так вставку производить, я просто не понял какой столбец у вас какому соответствовать должен, а что касается добавления если совпадения не найдены, то наоборот [vba]
Код
For i = 1 To K For j = 1 To N If Left(ArrA(i), Len(ArrC(j))) = ArrC(j) Then sch = 1 End If Next If sch <> 1 Then 'поиск первой пустой строки в первой таблице xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" xRow = xRow + 1 Loop 'вставка элементов Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(xRow, Íàïðèìåð 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(i, 5) 'аналогичная вставка next
[/vba]
по аналогии допишите сами , или если не понятно то уточните какой столбец во второй таблице должен соответствовать столбцу в первой таблице
[vba]
Код
Sub sFind() Dim ArrC() As String Dim ArrA() As String
xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" K = K + 1 ReDim Preserve ArrC(1 To K) ArrC(K) = Worksheets("article_all_5").Cells(xRow, 3)
xRow = xRow + 1 Loop
xRow = 2 Application.ScreenUpdating = False Application.Calculation = xlManual 'xlCalculationManual Workbooks.Open ThisWorkbook.Path & "\table_02" Do While Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(xRow, 1) <> "" N = N + 1 ReDim Preserve ArrA(1 To N) ArrA(N) = Worksheets("article_all_6").Cells(xRow, 1) xRow = xRow + 1 Loop
For i = 1 To K For j = 1 To N If ArrC(i) = Left(ArrA(j), Len(ArrC(i))) Then Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(i+1, Например 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(j+1, 5) 'и так сколько угодно строк с соответствующими столбцами одного листа другому ... End Sub
[/vba] вот как то так вставку производить, я просто не понял какой столбец у вас какому соответствовать должен, а что касается добавления если совпадения не найдены, то наоборот [vba]
Код
For i = 1 To K For j = 1 To N If Left(ArrA(i), Len(ArrC(j))) = ArrC(j) Then sch = 1 End If Next If sch <> 1 Then 'поиск первой пустой строки в первой таблице xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" xRow = xRow + 1 Loop 'вставка элементов Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(xRow, Íàïðèìåð 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(i, 5) 'аналогичная вставка next
[/vba]
по аналогии допишите сами , или если не понятно то уточните какой столбец во второй таблице должен соответствовать столбцу в первой таблицеKamikadze_N
Сообщение отредактировал Kamikadze_N - Четверг, 09.02.2017, 10:36
Мой вариант для получения совпадений - с использованием SQL для исполнения в Окне отладки (файл Dartray.xlsm из предыдущего поста №4 предварительно надо сохранить на диске и создать в нём лист Лист1): [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): _ rst.Open "SELECT * FROM [table1$] AS t1, [table2$] AS t2 " _ & " WHERE t2.Наименование Like t1.[Бренд+Модель] & '%'", _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & ThisWorkbook.FullName & _ ";Extended Properties='Excel 12.0;HDR=Yes'": _ [Лист1!A2].CopyFromRecordset rst
[/vba]Просто скопировать в Окно отладки и нажать Enter. В результате на листе Лист1, начиная с А2 - список совпадений по неполному значению (выводятся все колонки обеих таблиц, заголовки можно скопировать вручную). При желании можно оформить в виде нормального макроса.
Ранее подобный трюк с Окном отладки был представлен здесь. Сам запрос SQL был предварительно "написан" и отлажен в MS Access.
P.S. До кучи - два запроса для получения оставшихся (несовпадающих) записей из обеих таблиц. Запросы "заточены" на два новых листа (Лист2 и Лист3), которые следует добавить в рабочую книгу.
Несовпадающие записи из 1-й таблицы - 38 штук на Лист2: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): _ rst.Open "SELECT * FROM [table1$] " _ & " WHERE [Бренд+Модель] Not In (SELECT DISTINCT t1.[Бренд+Модель] FROM [table1$] AS t1, [table2$] AS t2 WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')", _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & ThisWorkbook.FullName & _ ";Extended Properties='Excel 12.0;HDR=Yes'": _ [Лист2!A2].CopyFromRecordset rst
[/vba]
Несовпадающие записи из 2-й таблицы - 9 штук на Лист3: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): _ rst.Open "SELECT * FROM [table2$] " _ & " WHERE Наименование Not In (SELECT DISTINCT t2.Наименование FROM [table1$] AS t1, [table2$] AS t2 WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')", _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & ThisWorkbook.FullName & _ ";Extended Properties='Excel 12.0;HDR=Yes'": _ [Лист3!A2].CopyFromRecordset rst
[/vba]
Мой вариант для получения совпадений - с использованием SQL для исполнения в Окне отладки (файл Dartray.xlsm из предыдущего поста №4 предварительно надо сохранить на диске и создать в нём лист Лист1): [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): _ rst.Open "SELECT * FROM [table1$] AS t1, [table2$] AS t2 " _ & " WHERE t2.Наименование Like t1.[Бренд+Модель] & '%'", _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & ThisWorkbook.FullName & _ ";Extended Properties='Excel 12.0;HDR=Yes'": _ [Лист1!A2].CopyFromRecordset rst
[/vba]Просто скопировать в Окно отладки и нажать Enter. В результате на листе Лист1, начиная с А2 - список совпадений по неполному значению (выводятся все колонки обеих таблиц, заголовки можно скопировать вручную). При желании можно оформить в виде нормального макроса.
Ранее подобный трюк с Окном отладки был представлен здесь. Сам запрос SQL был предварительно "написан" и отлажен в MS Access.
P.S. До кучи - два запроса для получения оставшихся (несовпадающих) записей из обеих таблиц. Запросы "заточены" на два новых листа (Лист2 и Лист3), которые следует добавить в рабочую книгу.
Несовпадающие записи из 1-й таблицы - 38 штук на Лист2: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): _ rst.Open "SELECT * FROM [table1$] " _ & " WHERE [Бренд+Модель] Not In (SELECT DISTINCT t1.[Бренд+Модель] FROM [table1$] AS t1, [table2$] AS t2 WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')", _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & ThisWorkbook.FullName & _ ";Extended Properties='Excel 12.0;HDR=Yes'": _ [Лист2!A2].CopyFromRecordset rst
[/vba]
Несовпадающие записи из 2-й таблицы - 9 штук на Лист3: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): _ rst.Open "SELECT * FROM [table2$] " _ & " WHERE Наименование Not In (SELECT DISTINCT t2.Наименование FROM [table1$] AS t1, [table2$] AS t2 WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')", _ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & ThisWorkbook.FullName & _ ";Extended Properties='Excel 12.0;HDR=Yes'": _ [Лист3!A2].CopyFromRecordset rst
Kamikadze_N, спасибо. Судя по всему в первом макросе не хватает End if, и next для обоих переменных. Попробовал дописать сам.
[vba]
Код
Sub sFind() Dim ArrC() As String Dim ArrA() As String
xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" K = K + 1 ReDim Preserve ArrC(1 To K) ArrC(K) = Worksheets("article_all_5").Cells(xRow, 3)
xRow = xRow + 1 Loop
xRow = 2 Application.ScreenUpdating = False Application.Calculation = xlManual 'xlCalculationManual Workbooks.Open ThisWorkbook.Path & "\table_02" Do While Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(xRow, 1) <> "" N = N + 1 ReDim Preserve ArrA(1 To N) ArrA(N) = Worksheets("article_all_6").Cells(xRow, 1) xRow = xRow + 1 Loop
For i = 1 To K For j = 1 To N If ArrC(i) = Left(ArrA(j), Len(ArrC(i))) Then Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(i + 1, 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(j + 1, 5) 'и так сколько угодно строк с соответствующими столбцами одного листа другому End If Next j Next i End Sub
[/vba]
Но в итоге ничего не получилось((
K-SerJC, Gustav, спасибо! Так, но не совсем.
Результатом должна быть таблица, содержащая колонки обеих исходных таблиц. Т.е. для найденных значений добавить в конец первой таблицы информацию из колонок C, D, E,...,Q второй таблицы.
Какие же всё-таки отзывчивые люди на этом форуме!
Kamikadze_N, спасибо. Судя по всему в первом макросе не хватает End if, и next для обоих переменных. Попробовал дописать сам.
[vba]
Код
Sub sFind() Dim ArrC() As String Dim ArrA() As String
xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" K = K + 1 ReDim Preserve ArrC(1 To K) ArrC(K) = Worksheets("article_all_5").Cells(xRow, 3)
xRow = xRow + 1 Loop
xRow = 2 Application.ScreenUpdating = False Application.Calculation = xlManual 'xlCalculationManual Workbooks.Open ThisWorkbook.Path & "\table_02" Do While Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(xRow, 1) <> "" N = N + 1 ReDim Preserve ArrA(1 To N) ArrA(N) = Worksheets("article_all_6").Cells(xRow, 1) xRow = xRow + 1 Loop
For i = 1 To K For j = 1 To N If ArrC(i) = Left(ArrA(j), Len(ArrC(i))) Then Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(i + 1, 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(j + 1, 5) 'и так сколько угодно строк с соответствующими столбцами одного листа другому End If Next j Next i End Sub
[/vba]
Но в итоге ничего не получилось((
K-SerJC, Gustav, спасибо! Так, но не совсем.
Результатом должна быть таблица, содержащая колонки обеих исходных таблиц. Т.е. для найденных значений добавить в конец первой таблицы информацию из колонок C, D, E,...,Q второй таблицы.
Какие же всё-таки отзывчивые люди на этом форуме! Dartray
Сообщение отредактировал Dartray - Четверг, 09.02.2017, 17:57
Dartray, так вы вторую то часть кода допише себя ниже[vba]
Код
For i = 1 To K For j = 1 To N If Left(ArrA(i), Len(ArrC(j))) = ArrC(j) Then sch = 1 End If Next If sch <> 1 Then 'поиск первой пустой строки в первой таблице xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" xRow = xRow + 1 Loop 'вставка элементов Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(xRow, Íàïðèìåð 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(i, 5) 'аналогичная вставка next
[/vba] что бы процедура полностью отработала или укажите в первом листе куда перенести столбцы из второго столбца соответственно и я допишу сам соответствия
Dartray, так вы вторую то часть кода допише себя ниже[vba]
Код
For i = 1 To K For j = 1 To N If Left(ArrA(i), Len(ArrC(j))) = ArrC(j) Then sch = 1 End If Next If sch <> 1 Then 'поиск первой пустой строки в первой таблице xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" xRow = xRow + 1 Loop 'вставка элементов Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(xRow, Íàïðèìåð 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(i, 5) 'аналогичная вставка next
[/vba] что бы процедура полностью отработала или укажите в первом листе куда перенести столбцы из второго столбца соответственно и я допишу сам соответствияKamikadze_N
Dartray, так вы вторую то часть кода допише себя ниже[vba]
Код
For i = 1 To K For j = 1 To N If Left(ArrA(i), Len(ArrC(j))) = ArrC(j) Then sch = 1 End If Next If sch <> 1 Then 'поиск первой пустой строки в первой таблице xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" xRow = xRow + 1 Loop 'вставка элементов Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(xRow, Íàïðèìåð 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(i, 5) 'аналогичная вставка next
[/vba] что бы процедура полностью отработала или укажите в первом листе куда перенести столбцы из второго столбца соответственно и я допишу сам соответствия
Dartray, так вы вторую то часть кода допише себя ниже[vba]
Код
For i = 1 To K For j = 1 To N If Left(ArrA(i), Len(ArrC(j))) = ArrC(j) Then sch = 1 End If Next If sch <> 1 Then 'поиск первой пустой строки в первой таблице xRow = 2 Do While Worksheets("article_all_5").Cells(xRow, 3) <> "" xRow = xRow + 1 Loop 'вставка элементов Workbooks("table_01.xlsx").Worksheets("article_all_5").Cells(xRow, Íàïðèìåð 5) = Workbooks("table_02.xlsx").Worksheets("article_all_6").Cells(i, 5) 'аналогичная вставка next
[/vba] что бы процедура полностью отработала или укажите в первом листе куда перенести столбцы из второго столбца соответственно и я допишу сам соответствияKamikadze_N
[/vba]- так и хочется его куда-нибудь засунуть с глаз долой. Всё остальное так компактно и симпатично получается, а радикал слегка подводит...
Решение, наконец, "проочевиделось" сегодня, благодаря этой теме - с помощью имени, создаваемого по Ctrl+F3, т.е. с помощью "Диспетчера имён" рабочей книги.
Создадим коротенькое имя src (от "source" - источник) и назначим ему в поле "Диапазон" такую формулу, по сути вычисляющую наш радикал:
И далее дерзко упростим наш первый составной оператор для Окна отладки: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ "SELECT * FROM [table1$] AS t1, [table2$] AS t2" & _ " WHERE t2.Наименование Like t1.[Бренд+Модель]&'%'" _ ,[src]: [Лист1!A2].CopyFromRecordset rst
[/vba] А?!
Если запрос достаточно короткий, то его можно разместить и на одной строке, не перенося оператор WHERE на другую: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ "SELECT * FROM [table1$] t1, [table2$] t2 WHERE t2.Наименование Like t1.[Бренд+Модель]&'%'" _ ,[src]: [Лист1!A2].CopyFromRecordset rst
[/vba]
В целом, подход вырисовывается такой: берем этот 3-х строчный шаблон, придаем нужный вид адресу вставки [Лист1!A2] и творим запрос SQL во второй строке.
Конечно, сложные запросы для наглядности лучше размещать на нескольких строках. Сформатируем по-другому второй и третий запрос из предыдущего поста (№ 5): [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ "SELECT * FROM [table1$] WHERE [Бренд+Модель] Not In" & _ " (SELECT DISTINCT t1.[Бренд+Модель] FROM [table1$] t1, [table2$] t2" & _ " WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')" _ ,[src]: [Лист2!A2].CopyFromRecordset rst
[/vba] Можно даже выделить запрос с помощью "пустых" строк (пробел+подчерк): [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ _ "SELECT * FROM [table2$] WHERE Наименование Not In" & _ " (SELECT DISTINCT t2.Наименование" & _ " FROM [table1$] t1, [table2$] t2" & _ " WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')" _ _ ,[src]: ['Лист 3'!A2].CopyFromRecordset rst
[/vba] (тэг vba съел ведущие пробелы перед подчерком во 2-й и 7-й строке, но при исполнении они там должны присутствовать! - можно добавить вручную в Окне отладки)
[/vba]- так и хочется его куда-нибудь засунуть с глаз долой. Всё остальное так компактно и симпатично получается, а радикал слегка подводит...
Решение, наконец, "проочевиделось" сегодня, благодаря этой теме - с помощью имени, создаваемого по Ctrl+F3, т.е. с помощью "Диспетчера имён" рабочей книги.
Создадим коротенькое имя src (от "source" - источник) и назначим ему в поле "Диапазон" такую формулу, по сути вычисляющую наш радикал:
И далее дерзко упростим наш первый составной оператор для Окна отладки: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ "SELECT * FROM [table1$] AS t1, [table2$] AS t2" & _ " WHERE t2.Наименование Like t1.[Бренд+Модель]&'%'" _ ,[src]: [Лист1!A2].CopyFromRecordset rst
[/vba] А?!
Если запрос достаточно короткий, то его можно разместить и на одной строке, не перенося оператор WHERE на другую: [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ "SELECT * FROM [table1$] t1, [table2$] t2 WHERE t2.Наименование Like t1.[Бренд+Модель]&'%'" _ ,[src]: [Лист1!A2].CopyFromRecordset rst
[/vba]
В целом, подход вырисовывается такой: берем этот 3-х строчный шаблон, придаем нужный вид адресу вставки [Лист1!A2] и творим запрос SQL во второй строке.
Конечно, сложные запросы для наглядности лучше размещать на нескольких строках. Сформатируем по-другому второй и третий запрос из предыдущего поста (№ 5): [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ "SELECT * FROM [table1$] WHERE [Бренд+Модель] Not In" & _ " (SELECT DISTINCT t1.[Бренд+Модель] FROM [table1$] t1, [table2$] t2" & _ " WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')" _ ,[src]: [Лист2!A2].CopyFromRecordset rst
[/vba] Можно даже выделить запрос с помощью "пустых" строк (пробел+подчерк): [vba]
Код
Set rst = CreateObject("ADODB.Recordset"): rst.Open _ _ "SELECT * FROM [table2$] WHERE Наименование Not In" & _ " (SELECT DISTINCT t2.Наименование" & _ " FROM [table1$] t1, [table2$] t2" & _ " WHERE t2.Наименование Like t1.[Бренд+Модель] & '%')" _ _ ,[src]: ['Лист 3'!A2].CopyFromRecordset rst
[/vba] (тэг vba съел ведущие пробелы перед подчерком во 2-й и 7-й строке, но при исполнении они там должны присутствовать! - можно добавить вручную в Окне отладки)Gustav
Kamikadze_N, столбцы 3-17 второй таблицы в столбцы 20-34 первой таблицы соответственно
Gustav, да, действительно все столбцы есть. извиняюсь, проглядел.
по поводу оптимизации: не совсем понял где создавать имя src
на мой взгляд для дальнейшего использования другими желающими надо из получившегося макроса сделать полноценную пользовательскую функцию, в которой можно было бы задавать оба диапазона адресов.
то бишь пишем эту функцию в первый пустой столбец первой таблицы, указываем диапазоны адресов для сравнения, а далее функция подставляет в ячейки справа, значения соответствующих ячеек из второй таблицы, находящихся справа от найденного соответствия.
картинка для наглядности. "X" - номер строки, в котором нашлось соответствие.
Kamikadze_N, столбцы 3-17 второй таблицы в столбцы 20-34 первой таблицы соответственно
Gustav, да, действительно все столбцы есть. извиняюсь, проглядел.
по поводу оптимизации: не совсем понял где создавать имя src
на мой взгляд для дальнейшего использования другими желающими надо из получившегося макроса сделать полноценную пользовательскую функцию, в которой можно было бы задавать оба диапазона адресов.
то бишь пишем эту функцию в первый пустой столбец первой таблицы, указываем диапазоны адресов для сравнения, а далее функция подставляет в ячейки справа, значения соответствующих ячеек из второй таблицы, находящихся справа от найденного соответствия.
картинка для наглядности. "X" - номер строки, в котором нашлось соответствие.Dartray