1

我在两张不同的表格中有数据。Sheet1.A 将包含一个字母数字条目“ABC123”,Sheet2.A 将包含一个类似的条目“ABC123 some text”或“some text ABC123”

此外,Sheet1 的条目总是比 Sheet2 少,因此会有不匹配项。

在 Sheet3 中,我希望能够显示 Sheet1.A 的所有条目以及来自 Sheet2.A 的相应匹配项,然后对于所有不匹配项,我希望它们显示在列表的底部。

理想输出示例:

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

目前我正在为 Sheet3.B 使用索引匹配(带有 LEFT 函数)公式,但不会产生理想的输出:

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

另外因为我使用的是 LEFT 函数,Sheet2.A 中的数据可能与 Sheet1.A 的排列方式不同,因此找不到某些条目,从而产生 #N/A

我还想补充一点,Sheet2.A 可能包含超过 256 个字符,这会导致索引匹配功能出现问题。这个问题不是头等大事,但如果它也能解决,那就太好了。

编辑:

问题和接受的答案现在正确地相互反映

4

1 回答 1

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
于 2013-05-21T14:24:44.367 回答