VBA:多个关键字查找
VBA: Multiple Keyword vlookup
我有一些叙述性描述需要在Excel中自动分类:
Description Category
I updated the o.s.
I installed the o.s.
I cleaned valve a
I cleaned valve b
I installed valve a
Today the o.s. was updated
我有另一个工作表,其中包含关键字和关键字关联的类别:
Keyword 1 Keyword 2 Keyword 3 Category
cleaned valve a A
installed valve a B
updated os C
installed os D
到目前为止,我的代码一次只能搜索一个关键字,因此会报告不正确的答案,因为某些关键字在多个叙述中使用:
Public Function Test21(nar As Range, ky As Range) As String
Dim sTmp As String, vWrd As Variant, vWrds As Variant
'Splits Fsr Narrative into individual words so it can be searched for keywords'
vWrds = Split(nar)
For Each vWrd In vWrds
If Not IsError(Application.VLookup(vWrd, ky, 3, False)) Then
sTmp = Application.VLookup(vWrd, ky, 3, False)
Exit For
End If
Next vWrd
Test21 = sTmp
End Function
我见过像 this 这样的算法,但我觉得我的目标可以更简单地实现,因为所有的叙述都相对简单。
感谢阅读!
您可以使用 VLOOKUP 匹配多个列,方法是创建一个将多个值连接在一起的 "match column",然后在该列中搜索匹配项。
因此,如果您在 A 列中使用此公式:
=B1 & "|" & C1 & "|" & D1
然后您可以针对该匹配列进行 VLOOKUP:
=VLOOKUP("blah|bleh|ugh", 'Sheet2!A1:E100', 5, FALSE)
这将匹配 B 列中有 "blah"、C 列中有 "bleh"、D 列中有 "ugh" 以及 return 中的值的一行E 列
虽然对于您的数据,我认为您可能还希望在尝试匹配一组关键字之前有一个步骤来清理您的输入。如果关键字按特定顺序排列,并且不会有任何非关键字造成混乱,我上面描述的方法最有效。 (它也非常适用于要匹配多个数据的 vlookup,即不同列中的名字、中间名和姓氏)
否则,您最终可能需要类别中的大量行 table 来涵盖您的关键字和它们可能伴随的其他随机词的所有可能组合和排列。
这就是我要找的:
Public Function Test22(nar As Range, key As Range, cat As Range) As String
For r = 1 To key.Height
If InStr(nar, key(r, 1)) And InStr(nar, key(r, 2)) Then
Test22 = cat(r)
Exit For
End If
Next r
End Function
我有一些叙述性描述需要在Excel中自动分类:
Description Category
I updated the o.s.
I installed the o.s.
I cleaned valve a
I cleaned valve b
I installed valve a
Today the o.s. was updated
我有另一个工作表,其中包含关键字和关键字关联的类别:
Keyword 1 Keyword 2 Keyword 3 Category
cleaned valve a A
installed valve a B
updated os C
installed os D
到目前为止,我的代码一次只能搜索一个关键字,因此会报告不正确的答案,因为某些关键字在多个叙述中使用:
Public Function Test21(nar As Range, ky As Range) As String
Dim sTmp As String, vWrd As Variant, vWrds As Variant
'Splits Fsr Narrative into individual words so it can be searched for keywords'
vWrds = Split(nar)
For Each vWrd In vWrds
If Not IsError(Application.VLookup(vWrd, ky, 3, False)) Then
sTmp = Application.VLookup(vWrd, ky, 3, False)
Exit For
End If
Next vWrd
Test21 = sTmp
End Function
我见过像 this 这样的算法,但我觉得我的目标可以更简单地实现,因为所有的叙述都相对简单。
感谢阅读!
您可以使用 VLOOKUP 匹配多个列,方法是创建一个将多个值连接在一起的 "match column",然后在该列中搜索匹配项。
因此,如果您在 A 列中使用此公式:
=B1 & "|" & C1 & "|" & D1
然后您可以针对该匹配列进行 VLOOKUP:
=VLOOKUP("blah|bleh|ugh", 'Sheet2!A1:E100', 5, FALSE)
这将匹配 B 列中有 "blah"、C 列中有 "bleh"、D 列中有 "ugh" 以及 return 中的值的一行E 列
虽然对于您的数据,我认为您可能还希望在尝试匹配一组关键字之前有一个步骤来清理您的输入。如果关键字按特定顺序排列,并且不会有任何非关键字造成混乱,我上面描述的方法最有效。 (它也非常适用于要匹配多个数据的 vlookup,即不同列中的名字、中间名和姓氏)
否则,您最终可能需要类别中的大量行 table 来涵盖您的关键字和它们可能伴随的其他随机词的所有可能组合和排列。
这就是我要找的:
Public Function Test22(nar As Range, key As Range, cat As Range) As String
For r = 1 To key.Height
If InStr(nar, key(r, 1)) And InStr(nar, key(r, 2)) Then
Test22 = cat(r)
Exit For
End If
Next r
End Function