Поиск частично совпадающей строки

#excel

#excel

Вопрос:

Привет, как я могу найти две частично совпадающие ячейки?

Например:

A1 содержит яблочно-морковного слона на листе 1

B2 содержит яблочно-бананово-морковные напитки на листе 2

После этого он выведет разницу рядом с ячейкой 5 рабочего листа 2

C2 содержит банановые напитки на листе 2

Спасибо

 Public lRowA as Long
Public lRowB as Long

Sub compare()

dim LCA as interger
dim LCB as interger

Sheet1.Activate
call rangemethodA
Sheet2.Activate 
call rangemethodB

For LCA= 2 to lRowA

For LCB= 2 to lRowB

if InStr(Sheets("Sheet1").Range("B" amp; LCB), Sheets("Sheet2").Range("A" amp; LCA)) > 0 Then

WORDDIF (Sheets("Sheet1").Range("A" amp; LCA),  Sheets("Sheet2").Range("B" amp; LCB))
Sheets("Sheet1").Range("C" amp; LCB).value = WORDDIF 

Else 

Goto NextLCB

Endif

NextLCB:

Next LCB

Next LCA

End sub



Function WORDDIF(rngA As Range, rngB As Range) As String
    
    Dim WordsA As Variant, WordsB As Variant
    Dim ndxA As Long, ndxB As Long, strTemp As String
        
    WordsA = Split(rngA.Text, " ")
    WordsB = Split(rngB.Text, " ")
    
    For ndxB = LBound(WordsB) To UBound(WordsB)
        For ndxA = LBound(WordsA) To UBound(WordsA)
            If StrComp(WordsA(ndxA), WordsB(ndxB), vbTextCompare) = 0 Then
                WordsA(ndxA) = vbNullString
                Exit For
            End If
        Next ndxA
    Next ndxB
    
    For ndxA = LBound(WordsA) To UBound(WordsA)
strTemp = strTemp amp; IIf(WordsA(ndxA) <> vbNullString, WordsA(ndxA), "-") amp; " "
    Next ndxA
    
    WORDDIF = Trim(strTemp)
End Function
  

Комментарии:

1. Вы могли бы использовать Power Query; создайте два Lists из каждой строки; и RemoveMatchingItems во втором списке совпадают с первым.

Ответ №1:

Одним из способов было бы использовать пользовательскую функцию и использовать цикл Split , предполагая, что разделителем всегда является пробел.

 Function CompareDiff(v1 As Variant, v2 As Variant) As String

Dim a1, a2, i As Long

a1 = Split(v1, " ")
a2 = Split(v2, " ")
For i = LBound(a2) To UBound(a2)
    If IsError(Application.Match(a2(i), a1, 0)) Then
        CompareDiff = CompareDiff amp; a2(i)
    End If
Next i

End Function
  

Назовите это так:

 Sub xx()

'call function thus

Worksheets("Sheet2").Range("C2").Value = CompareDiff(Worksheets("Sheet1").Range("A1"), Worksheets("Sheet2").Range("B2"))

End Sub
  

Конечно, более очевидное использование находится непосредственно на листе, как обычная формула, например

 =CompareDiff(A1,B1)
  

Комментарии:

1. Спасибо, я попробую.