Что вы хотите сделать, так это ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ на таблице на втором листе с таблицей на первом.
Итак, ниже Вариант 1 с PowerQuery и 2 с VBA-SQL
Вариант 1:
Это можно сделать с помощью бесплатной надстройки PowerQuery (построен в 2016 г.).
1) Настройте свои данные на листах 1 и 2 в виде таблиц (щелкните заполненную ячейку в диапазоне данных, а затем нажмите Alt + T > выберите, что в моей таблице есть заголовки.

2) Выделите каждую таблицу, а затем перейдите на вкладку data
(2016) или Powerquery
(2010-2013) и создайте новые данные запроса из таблицы (Get and Transform
)
Появится окно редактора запросов, показывающее вашу таблицу (запрос/таблица, которую вы можете переименовать с правой стороны)

3) Затем вы можете выбрать закрыть и load to > only create connection
(в верхнем левом углу окна

Только выбор подключения

Повторите для таблиц на листах 1 и 2.
4) Затем создайте новый запрос> объедините запросы> объедините

Убедитесь, что ваша таблица подзадач является первой выбранной таблицей, а основные задачи — второй. Нажмите на столбцы Content_Category_Product Sub Type
в обеих таблицах, чтобы они были выделены (это будет столбец соединения).
Убедитесь, что join kind
соответствует Left outer
, и что для сопоставления выбора стоит зеленая галочка.
Затем нажмите «ОК» и загрузите на лист3.

5) Отсортировать полученную таблицу по первому столбцу по возрастанию

6) Посмотреть результат:

Есть много ресурсов о Powerquery
, которые вы можете найти. Это позволит вам изменить имена столбцов и т. д. Вы также можете удалить ненужные столбцы, чтобы они соответствовали опубликованному вами изображению.
Или вариант 2:
С SQL адаптируя подход из barrowc и функцию Johan Kreszner, убедившись, что вы перешли в редактор VBA (Alt-F11) и добавили ссылку (Tools > References
) на "Microsoft ActiveX Data Objects X.X Library
".
Я предположил, что только таблицы находятся на листах 1 и 2, но в противном случае вам может потребоваться изменить SQL, чтобы настроить таргетинг на диапазоны таблиц (объекты списка), поэтому я включил функцию Йохана для возврата диапазона объекта списка, предоставленного вам передать имя таблицы в виде строки.
Option Explicit
Sub LeftJoinTables()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 12.0 Macro;IMEX=1;HDR=YES"";"
.Open
End With
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT [Main Task], [Sub Task], [Budget Hours] FROM [Sheet2$] LEFT JOIN [Sheet1$] ON [Sheet2$].[Content Category_Product Sub type] = " & _
"[Sheet1$].[Content Category_Product Sub type] ORDER BY [Main Task]", cn
Dim fld As ADODB.Field
Dim i As Integer
With ThisWorkbook.Worksheets("Sheet3")
.UsedRange.ClearContents
i = 0
For Each fld In rs.Fields
i = i + 1
.Cells(1, i).Value = fld.Name
Next fld
.Cells(2, 1).CopyFromRecordset rs
.UsedRange.Columns.AutoFit
End With
rs.Close
cn.Close
End Sub
Public Function GetRange(ByVal sListName As String) As String
Dim oListObject As ListObject
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
For Each ws In wb.Sheets
For Each oListObject In ws.ListObjects
If oListObject.Name = sListName Then
GetRange = "[" & ws.Name & "$" & Replace(oListObject.Range.Address, "$", "") & "]"
Exit Function
End If
Next oListObject
Next ws
End Function
22.12.2017