Шаги, необходимые для этого вручную, довольно длинные и утомительные.
Предполагая, что данные в Рабочей книге 1 находятся в Sheet1
следующем, выполните следующие действия:
- Скопируйте данные (включая заголовки) из Рабочей книги 2
- Вставить в ячейку
A1
пустого листа в Workbook 1 (скажемSheet2
) - Введите эту формулу в
G1
→=MATCH(B1,Sheet1!B:B,0)
- Скопируйте или вставьте формулу вниз соответствующим образом. Я предпочитаю эту последовательность нажатий клавиш:
- Left
- Ctrl+Down
- Right
- Ctrl+ Shift+Up
- Ctrl+D
- Включить фильтрацию по столбцу ( Ctrl+ Shift+ L)
- Фильтр
#N/A
только. (Если их нет, игнорируйте этот шаг и следующий.) - Удалить все
#N/A
строки - Удалить столбцы
C
,D
,F
,G
- Выделить данные
- Скопируйте данные ( исключая заголовки) из
Sheet1
Рабочей книги 1 (текущей рабочей книги) - Щелкните правой кнопкой мыши в ячейке
A2
сSheet2
и выберитеInsert Copied Cells
- Убедитесь, что
Shift cells down
выбран, нажмитеOK
- Выберите все данные и удалите дубликаты с помощью
Data
→Data Tools
→Remove Duplicates
. (Убедитесь, что отмечен только столбецID
.) - Сортировать по столбцу
ID
Лучшее решение, конечно, состоит в том, чтобы автоматизировать эти шаги. Это то, что делает следующий код VBA.
Скопируйте и вставьте этот код в стандартный модуль в Рабочей книге 1:
'============================================================================================ ' Module : a standard module in Workbook 1 ' Version : 0.1.1 ' Part : 1 of 1 ' References : N/A ' Source : https://superuser.com/a/1331855/763880 '============================================================================================ Option Explicit Public Sub CrossCompareSheets() Const s_CompareToWorkbook As String = "Workbook 2.xlsx" Const s_CompareToSheet As String = "Sheet1" Const s_CompareToTopLeft As String = "A1" Const s_CompareToExtraCols As String = "C,D,F" Const s_SourceSheet As String = "Sheet1" Const s_SourceTopLeft As String = "A1" Const n_SourceMatchColumn As Long = 2 Const s_ResultSheet As String = "Sheet2" Const s_ResultTopLeft As String = "A1" Const n_ResultMatchColumn As Long = 2 Const n_ResultUniqueColumn As Long = 1 Const n_ResultSortColumn As Long = 1 Dim wkstCompareTo As Worksheet: Set wkstCompareTo = Workbooks(s_CompareToWorkbook).Worksheets(s_CompareToSheet) Dim rngCompareTo As Range: Set rngCompareTo = wkstCompareTo.Range(s_CompareToTopLeft).CurrentRegion Dim wkstSource As Worksheet: Set wkstSource = ActiveWorkbook.Worksheets(s_SourceSheet) Dim rngSource As Range: Set rngSource = wkstSource.Range(s_SourceTopLeft).CurrentRegion Dim wkstResult As Worksheet: Set wkstResult = ActiveWorkbook.Worksheets(s_ResultSheet) Dim rngResult As Range Dim celResultTopLeft As Range: Set celResultTopLeft = wkstResult.Range(s_ResultTopLeft) wkstResult.UsedRange.Clear rngCompareTo.Copy Destination:=wkstResult.Range(s_ResultTopLeft) Set rngResult = celResultTopLeft.CurrentRegion With rngResult.Resize(ColumnSize:=1).Offset(ColumnOffset:=rngResult.Columns.Count) .FormulaR1C1 = Replace(Replace(Replace( _ "=MATCH(RC,!C,0)" _, "", n_ResultMatchColumn), "", s_SourceSheet), "", n_SourceMatchColumn) .Copy .PasteSpecial xlPasteValues End With Set rngResult = celResultTopLeft.CurrentRegion rngResult.AutoFilter Field:=rngResult.Columns.Count, Criteria1:="#N/A" rngResult.Offset(RowOffset:=1).SpecialCells(xlCellTypeVisible).EntireRow.Delete rngResult.AutoFilter Dim colsToBeDeleted As Range Set colsToBeDeleted = rngResult.Resize(ColumnSize:=1).Offset(ColumnOffset:=rngResult.Columns.Count - 1).EntireColumn Dim varColumn As Variant For Each varColumn In Split(s_CompareToExtraCols, ",") Set colsToBeDeleted = Union(colsToBeDeleted, wkstResult.Range(varColumn & ":" & varColumn)) Next varColumn colsToBeDeleted.Delete Set rngResult = celResultTopLeft.CurrentRegion rngSource.Offset(RowOffset:=1).Copy Destination:=celResultTopLeft.Offset(RowOffset:=rngResult.Rows.Count) Set rngResult = celResultTopLeft.CurrentRegion rngResult.RemoveDuplicates Columns:=n_ResultUniqueColumn, Header:=xlYes Set rngResult = celResultTopLeft.CurrentRegion With wkstResult.Sort .SortFields.Clear .SortFields.Add Key:=rngResult.Columns(n_ResultSortColumn) .SetRange rngResult .Header = xlYes .Apply End With End Sub
Заметки:
Вы можете изменить константы в верхней части, чтобы обслуживать различные столбцы и имена файлов, и код будет автоматически корректироваться.