2013-05-21 4 views
1

У меня есть данные в двух разных листах. Sheet1.A будет содержать буквенно-цифровую запись «ABC123» и Sheet2.A будет содержать аналогичную запись «ABC123 какой-то текст» или «какой-то текст ABC123»Сравнение двух наборов данных для совпадений и несимметрий

Кроме того, Sheet1 всегда будет иметь меньше записей, чем Sheet2, поэтому будут несимметричные ,

В Sheet3 Я хочу, чтобы иметь возможность отображать все записи для Sheet1.A с соответствующим соответствием с Sheet2.A, а затем для всех не совпадений, я хотел бы, чтобы они отображались в нижней части списка.

Пример идеального выхода:

Sheet3.A Sheet3.B 
ABC123 ABC123 
ABC222 ABC222 
ABC333 ABC333 
      ABC444 
      ABC555 
      ABC666 

В настоящее время я использую матч индекса (с левой функции) формулу для Sheet3.B, но не производит идеальный выход:

Sheet3.A Sheet3.B 
ABC123 ABC123 
ABC222 ABC222 
ABC333 ABC333 
      ABC444 
      ABC444 
      ABC444 

Кроме потому что я использую функцию LEFT и данные в Sheet2.A не могут быть расположены аналогично Sheet1.A, некоторые записи не найдены, таким образом производя # N/A

Я также хотел бы добавьте, что Sheet2.A может содержать более 256 символов, что вызывает проблемы для функции совпадения индексов. Эта проблема не является главным приоритетом, но если ее можно решить, это будет здорово.

Edit:

Вопросы и Принимается ответ теперь правильно отражают друг друга

ответ

1

Вы могли бы использовать метод .Find, поиск частичных совпадений.

Sub FindPartialString() 

Dim wsList As Worksheet 
Dim wsSearch As Worksheet 
Dim wsOutput As Worksheet 
Dim lastRow As Long 
Dim rngList As Range 
Dim rngMatch As Range 
Dim cl As Range 
Dim arrNonMatches() As Variant 
Dim nonMatchCount As Long 


Set wsList = Sheets(1) '## Modify as needed 
Set wsSearch = Sheets(2) '## Modify as needed 
Set wsOutput = Sheets(3) '## Modify as needed 
Set rngList = wsList.Range("A2:A5") '## Modify as needed 

For Each cl In rngList 
    Set rngMatch = Nothing 'clear the container before each query 
    'look for a partial match: 
    Set rngMatch = wsSearch.Cells.Find(What:=cl.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False) 

    'Store the matches and non matches in separate arrays: 
    If Not rngMatch Is Nothing Then 
     lastRow = 1 + Application.WorksheetFunction.CountA(wsOutput.Range("A:A")) 
     'put the searched value in column A: 
     wsOutput.Cells(lastRow, 1) = cl.Value 
     'Put the found value in column B: 
     wsOutput.Cells(lastRow, 2) = rngMatch.Value 
    Else: 
     'store non-matches in an array 
     ReDim Preserve arrNonMatches(nonMatchCount) 
     arrNonMatches(nonMatchCount) = cl.Value 
     nonMatchCount = nonMatchCount + 1 
    End If 
Next 

'Print out the non-matches 
lastRow = lastRow + 1 
wsOutput.Cells(lastRow, 1).Resize(UBound(arrNonMatches) + 1, 1).Value = Application.Transpose(arrNonMatches) 
End Sub 
+0

Thanks David - ваше решение очень близко к достижению желаемого результата. Однако я должен кое-что прояснить - элемент wsList может отсутствовать в wsSearch. Из-за этого текущая подпрограмма выводит wsList nonmatches в столбец wsOutput A и пробел для столбца wsOutput B. – fresh

+0

Разве это не то, что вы хотите? 'then for all non matches, я бы хотел, чтобы они отображались в нижней части списка.' Что бы вы хотели в столбце B? Нет совпадения, поэтому я помещал несоответствия в нижней части столбца A, поскольку я понял вопрос. –

+0

Я случайно представил свой комментарий без ответа. Я отредактировал свой оригинальный вопрос, чтобы отразить это изменение в желаемом выходе - прошу простить отсутствие ясности в исходном вопросе. – fresh

Смежные вопросы