As etapas necessárias para fazer isso manualmente são bem longas e tediosas.
Supondo que os dados na pasta de trabalho 1 estão em Sheet1
, siga estas etapas:
- Copie os dados (incluindo cabeçalhos) da pasta de trabalho 2
- Cole na célula
A1
de uma planilha vazia na pasta de trabalho 1 (digamos,Sheet2
) - Insira esta fórmula em
G1
→=MATCH(B1,Sheet1!B:B,0)
- Copie e cole ou preencha a fórmula corretamente. Eu prefiro esta seqüência de teclas:
- À esquerda
- Ctrl + Abaixo
- Direito
- Ctrl + Deslocamento + Acima
- Ctrl + D
- Ative a filtragem para a coluna ( Ctrl + Deslocamento + L )
- Filtre por
#N/A
apenas. (Se não houver nenhum, ignore este passo e o próximo). - Excluir todas as
#N/A
linhas - Excluir colunas
C
,D
,F
,G
- Realce os dados
- Copie os dados ( excluindo cabeçalhos) de
Sheet1
da pasta de trabalho 1 (a pasta de trabalho atual) - Clique com o botão direito do mouse na célula
A2
deSheet2
e selecioneInsert Copied Cells
- Verifique se
Shift cells down
está selecionado, a imprensaOK
- Selecione todos os dados e remova as duplicatas por meio de
Data
→Data Tools
→Remove Duplicates
. (Certifique-se de que somente a colunaID
esteja marcada.) - Classificar pela coluna
ID
A melhor solução, claro, é automatizar essas etapas. Isso é o que o seguinte código VBA faz.
Copie e cole este código em um módulo padrão na pasta de trabalho 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{a},{Sheet}!C{b},0)" _
, "{a}", n_ResultMatchColumn), "{Sheet}", s_SourceSheet), "{b}", 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
Notas:
Você pode alterar as constantes na parte superior para atender diferentes colunas e nomes de arquivos, e o código será ajustado automaticamente.