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))))),"")
我有一个包含两个 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))))),"")