Перекрестное сравнение данных между двумя рабочими книгами

318
Wilson Liao

Я пытаюсь сравнить 2 данных в 2 разных книгах. Затем мне нужно найти недостающие данные между двумя и составить отдельный новый, обновленный список. Тем не менее, мне нужно обновить данные, только если есть запись из первого списка. Если нет, то нет необходимости обновлять эти данные.

НАПРИМЕР

Workbook 1 ID Name Code ... futa-123456 Max 0a futa-123458 Max 0a  futb-ms8793 John SX futg-809153 May gH ...  Workbook 2 ID Name Contact Address Code Flag ... futa-123456 Max ... ... 0a Y futa-123457 Max ... ... 0a Y futb-XY5543 Sam ... ... SX N futg-809153 May ... ... gH Y futg-809154 May ... ... gH Y ...   Final Result Separate new sheet (doesn't natter which workbook) ID Name Code ... futa-123456 Max 0a futa-123457 Max 0a*  futa-123458 Max 0a  futb-ms8793 John SX futg-809153 May gH futg-809154 May gH* ... 

Таким образом, Excel покажет различия по обеим сторонам рабочей книги для Макса, потому что есть различия между обеими сторонами, и они присутствуют в рабочей книге 1. В мае различия будут отображаться только в рабочей книге 2, так как различия есть только в рабочей книге 2 (но до сих пор показывают с мая, присутствует в рабочей тетради 1). Сэм не будет выделен, потому что в книге 1 нет Сэма.

По сути, я сравниваю с Workbook 1 в качестве источника. Если в рабочей книге 1 нет записи, но есть в рабочей книге 2, она не будет выделена.

Есть ли способ сделать это?

1
Пожалуйста, измените окончательный результат для лучшего понимания. Rajesh S 5 лет назад 0
Казалось, я не могу выделить изменения, поэтому я добавил * в конце. Дайте мне знать, если это все еще неясно. Wilson Liao 5 лет назад 0

3 ответа на вопрос

0
robinCTS

Шаги, необходимые для этого вручную, довольно длинные и утомительные.

Предполагая, что данные в Рабочей книге 1 находятся в Sheet1следующем, выполните следующие действия:

  1. Скопируйте данные (включая заголовки) из Рабочей книги 2
  2. Вставить в ячейку A1пустого листа в Workbook 1 (скажем Sheet2)
  3. Введите эту формулу в G1=MATCH(B1,Sheet1!B:B,0)
  4. Скопируйте или вставьте формулу вниз соответствующим образом. Я предпочитаю эту последовательность нажатий клавиш:
    • Left
    • Ctrl+Down
    • Right
    • Ctrl+ Shift+Up
    • Ctrl+D
  5. Включить фильтрацию по столбцу ( Ctrl+ Shift+ L)
  6. Фильтр #N/Aтолько. (Если их нет, игнорируйте этот шаг и следующий.)
  7. Удалить все #N/Aстроки
  8. Удалить столбцы C, D, F,G
  9. Выделить данные
  10. Скопируйте данные ( исключая заголовки) из Sheet1Рабочей книги 1 (текущей рабочей книги)
  11. Щелкните правой кнопкой мыши в ячейке A2с Sheet2и выберитеInsert Copied Cells
  12. Убедитесь, что Shift cells downвыбран, нажмитеOK
  13. Выберите все данные и удалите дубликаты с помощью DataData ToolsRemove Duplicates. (Убедитесь, что отмечен только столбец ID.)
  14. Сортировать по столбцу 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 

Заметки:

Вы можете изменить константы в верхней части, чтобы обслуживать различные столбцы и имена файлов, и код будет автоматически корректироваться.

Я ценю это, но VBA в моем случае неосуществима. Данные, столбцы и имена файлов, которые я сравниваю, постоянно меняются. Это может быть долго и утомительно, но все равно будет бесконечно быстрее, чем ручное сравнение. Надеюсь, ты сможешь мне помочь. Wilson Liao 5 лет назад 0
@WilsonLiao Ладно, доки. Я обновлю свой ответ. Просто чтобы вы знали, я * настроил * VBA таким образом, чтобы вы могли легко изменять столбцы и имена файлов в верхней части, а затем код будет работать с новыми значениями. Так будет быстрее. robinCTS 5 лет назад 0
Ах я вижу. У меня 0 знаний по VBA, поэтому мне нужно время, чтобы поэкспериментировать с этим. Я все еще оценил бы метод не VBA, поскольку мне все еще нужно использовать его в краткосрочной перспективе. Спасибо! Wilson Liao 5 лет назад 0
@WilsonLiao ОК. Получил пошаговые инструкции, все разобрано (надеюсь ;-)) и загружено. robinCTS 5 лет назад 0
Если я хочу, чтобы новая обновленная информация была выделена в новой таблице, как мне это сделать? Wilson Liao 5 лет назад 0
@WilsonLiao Dang. Я собирался решить это и добавить это. Я разобрался с этим сейчас. Еще больше шагов! Я обновлю ответ сейчас, выполнив шаги вручную, но обновление кода придется подождать до завтра, РЕДАКТИРОВАТЬ: Готово. Ручные шаги теперь будут выделять новую обновленную информацию. robinCTS 5 лет назад 0
-1
LJ01

РЕДАКТИРОВАТЬ перечитал вопрос, и обновил с моим пониманием проблемы ...

Второе редактирование, где я запутался между листами 1 и 2

Чтобы найти данные, которые нужно перейти на новый лист, потому что он существует только на листе 1 ...

=match(a1, sheet2!a:a,0). 

Фильтр для #na.

Чтобы обновить данные на листе 1, добавьте столбец справа от данных, примерно так;

=Iferror(Index(sheet2!d:d,match(a1, sheet2!a:a,0)),D1) 

Скопируйте это в запасной столбец на листе 1, затем скопируйте и вставьте как значения исходного столбца D1.

Еще один пионт; если идентификаторы не совпадают между листами (их нельзя использовать для сопоставления), создайте объединенное имя и код «вспомогательный столбец» или что-либо еще, что можно использовать для правильного сравнения двух листов.

(Если идентификаторы не могут быть использованы для сопоставления, я бы также начал задавать много вопросов о данных, но это выходит за рамки вопроса)

Это будет включать данные, которых нет в исходном списке. Я обновляю текущую информацию только в книге 1 и игнорирую всю другую информацию. IE Сэм вообще не будет выделен, несмотря на то, что его нет в списке рабочей книги 1. Но пропущенные данные Макса будут выделены, как он есть в списке в рабочей книге 1. Есть ли способ, которым я могу отфильтровать это? Wilson Liao 5 лет назад 0
@WilsonLiao Sniped! robinCTS 5 лет назад 0
К сожалению, ваша интерпретация проблемы не имеет значения - только ОП :-) Ваша первая формула - многообещающее начало - она ​​исключает все дубликаты. Но когда / если вы получаете, что вторая формула работает должным образом (и это также влечет за собой изменение первой формулы), она не может гарантировать правильное получение всех отсутствующих данных, поскольку она захватывает только первую. Так что иногда он будет захватывать меньше, а иногда он будет захватывать одни и те же данные более одного раза. Единственное время, которое будет правильным, если в Рабочей книге 2 будет точно одно «пропущенное» имя, соответствующее точно одному имени в Рабочей книге 1. robinCTS 5 лет назад 0
@ Робин, моя интерпретация была упомянута, потому что я не был уверен, что у меня все правильно, немного трудно исправить, решить проблему с неверной интерпретацией ... что, похоже, и произошло :-D И ваши следующие замечания превосходны - я смешал на листе 1 и 2. LJ01 5 лет назад 0
-1
Rajesh S

Я хотел бы предложить самый простой способ сравнить и создать уникальный список.

Следуй этим шагам:

  • Скопируйте данные из обеих рабочих книг на чистый лист.
  • Выберите Все данные.
  • На вкладке «Главная» нажмите «Сортировать и отфильтровать».
  • Сортировать данные в порядке возрастания по идентификатору.
  • Снова выберите все данные.
  • Перейдите на вкладку «Данные» и нажмите «Удалить дубликат».
  • Выберите столбец ID, чтобы найти и удалить дубликаты.

Вы найдете ваши данные, как показано ниже:

ID Name Code futa-123456 Max 0a futa-123457 Max 0a futa-123458 Max 0a futb-ms8793 John SX futb-xy5543 Sam Sx futg-890153 May gH futg-890154 May GH 

NB

  • Показанный выше метод подходит для небольшой базы данных.
  • Вы можете записать весь процесс как макрос, чтобы работать быстрее.
Извините, но это решение не работает. Он включает в себя `Sam` в результате, который ОП четко прописал, и его следует исключить. robinCTS 5 лет назад 0
Поскольку SAM является уникальной записью в Листе 2, так что по логике она появится после сравнения обоих листов на предмет уникальных записей. Поскольку OP просто копирует и вставляет значения, OP пропустил его для включения в список. Rajesh S 5 лет назад 0

Похожие вопросы