VBA 两列之间的部分匹配

VBA partial match between two column

我有一个包含两个 sheet 的工作簿,“RO”和“LookUp”

在 Sheet“RO”的 K 列中有一个地址列表,在“LookUp”的 E 列中有一个城镇列表。

在Sheet“RO”列问我正在尝试提取与“查找”列表中的城镇相匹配的城镇名称sheet。

我已经尝试了部分 Vlookup 和索引和匹配函数的变体,但它们显然没有用,因为它们是倒退的(在城镇列表中查找完整地址,而不是相反)

=VLOOKUP("*"&J2&"",'Look up Data'!E:E,1,0)

我尝试使用 like 做一个 if 语句(我知道它不会工作,但它可能让我知道我正在尝试做什么)见下文。

Sub ROITown()

    Dim lRow As Long
    Dim iCntr As Long
    Set ws = Worksheets("RO")
    Set ls = Worksheets("LookUp")
    lRow = ws.Cells(Rows.Count, 5).End(xlUp).Row
    For iCntr = lRow To 2 Step -1
        If ws.Cells(iCntr, 10).Value Like ls.Cells(iCntr, 5).Value Then
            ws.Cells(iCntr, 17).Value = ls.Cells(iCntr, 5).Value
        End If
    Next iCntr
End Sub

这些是我预期输出的一些例子

K 列“RO”
THE MEADOW AVENUE DEMESNE NAAS
BELFRY PARK DUNDALK CO. LOUTH
KESTREL PUB CO. LOUTH
AVONDALE CREST DUNBOYNE CO. MEATH
KNIGHTSBROOK STREET TRIM CO. MEATH
泰勒格林大道巴尔布里根有限公司都柏林

E 列“查找”
阿西
巴尔布里根
巴尔多伊尔
城西
克莱恩
德罗赫达
邓老海尔
邓博因
邓多克
邓加文
莫纳斯特雷万
马林加
纳斯
纳文
特拉莫尔
Trim
图阿姆

Q 列“RO”中的预期结果
纳斯
邓多克

邓博因
Trim
巴尔布里根

如您所见,对于解决方案,我需要它不区分大小写,而且在列表中找不到匹配的城镇时,它应该将单元格留空。

欢迎任何建议,即使是最基本的建议,即使只是指出正确的方向或让我知道我应该搜索什么来找到解决方案。

提前致谢:)

您需要 2 个嵌套循环来独立迭代工作表。

Option Explicit

Sub ROITown()

    Dim s As String, arTown, LastRow As Long
    Dim r As Long, i As Long, n As Long
    
    With Worksheets("LookUp") ' towns
         LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
         arTown = .Range("E2:E" & LastRow)
    End With
    
    With Worksheets("RO") ' address
        LastRow = .Cells(.Rows.Count, "K").End(xlUp).Row
        For r = 2 To LastRow
            For i = 1 To UBound(arTown)
                s = Trim(arTown(i, 1))
                If InStr(1, .Cells(r, "K"), s, vbTextCompare) Then
                    .Cells(r, "Q") = s
                    n = n + 1
                    Exit For
                End If
            Next
        Next r
    End With
    MsgBox n & " rows updated", vbInformation
    
End Sub

你可以用公式来做到这一点。

命名表并使用结构化引用,但如果您愿意,可以将其更改为常规寻址:

此公式至少适用于 2010 年以来的任何版本

=IFERROR(INDEX(Lookup,AGGREGATE(15,6,1/(ISNUMBER(SEARCH(Lookup[Lookup],TRANSPOSE(LongName[Towns]))))*ROW(Lookup)-ROW(Lookup[#Headers]),ROW(INDEX($A:$A,1):INDEX($A:$A,ROWS(Lookup))))),"")