在Excel VBA中匹配类似

我一直在试图find类似的匹配来填补第一个屏幕截图中的空白Sapcode字段。

下面第二个屏幕截图中的卡片types字段包含第一个屏幕截图中卡片types列的相关字词。 例如卡片types和城市。 第二个屏幕截图中的数据还包含这些单词的Sapcode。

我想通过匹配第二个屏幕截图中另一个卡types列中的单词来查找第一个屏幕截图中的卡types值的Sapcode。 缺lessSapcode的工作表:

输入文件,我想填充sapcode

符合规则的工作表:

规则书页

例如 – 对于input文字签证/ 20160927 / ET-Chennai / FT,我可以通过匹配签证和钦奈来匹配SAP008。

这是我的代码到目前为止:

 For i = 9 To input_sht.Cells(input_sht.Rows.Count, 1).End(xlUp).Row input_txt = input_sht.Range("B" & i).Value For j = 2 To rule_sht.Cells(rule_sht.Rows.Count, 1).End(xlUp).Row rulebook_sht = rule_sht.Range("B" & j).Value If rulebook_sht <> "" Then If InStr(input_txt, rulebook_sht) > 0 Then input_sht.Range("C" & i).Value = rule_sht.Range("C" & j).Value End If End If Next Next 

上面的代码工作正常,如果有一个只是签证领域意味着它将与签证相匹配,并给予第一个search选项,但它不是检查位置。 我怎样才能更新我的代码来匹配所有的单词?

您可以使用带有通配符的Like运算符来比较两个string。 在这种情况下,您需要使用匹配零个或多个其他字符的*通配符。 例如,在VBE立即窗口中inputthis并获得True

 ? "visa/20160927/Chennai/FT" Like "*visa*Chennai*" 

因此,我们可以使用它遍历所有的input( Card Type in first screenshot),并与所有的“规则”(第二个屏幕截图中的Card Type )进行比较。

Like运算符匹配的情况下,您可以获得Sapcode并更新空白列。 要创build规则的“通配”版本,您可以使用以下代码:

 strWildcardRule = "*" & Join(Split(strRule, " "), "*") & "*" 

将“规则”的元素拆分成一个数组,然后用*replace通配符,并将它们包围起来。 所以:

 visa Chennai 

变为:

 *visa*Chennai* 

然后你可以使用Like运算符。

该代码将适用于您提供的testing数据。 我已经评论过,所以你可以按照

 Option Explicit Option Compare Text Sub LookupSapcode() ' all the required variables Dim ws As Worksheet Dim rngInput As Range Dim rngRules As Range Dim rngOutput As Range Dim lngInputRow As Long Dim lngRuleRow As Long Dim strRule As String Dim strInput As String Dim strOutput As String Dim strWildcardRule As String ' set references to sheet and ranges to work with Set ws = ThisWorkbook.Worksheets("Sheet1") Set rngInput = ws.Range("A2:A10") Set rngOutput = ws.Range("B2:B10") Set rngRules = ws.Range("D2:E10") ' iterate rows For lngInputRow = 1 To rngInput.Rows.Count ' get card type strInput = rngInput.Cells(lngInputRow, 1).Value ' iterate rules For lngRuleRow = 1 To rngRules.Rows.Count ' get the rule as a string strRule = rngRules.Cells(lngRuleRow, 1).Value ' assume a match on this row of rules and get sap code strOutput = rngRules.Cells(lngRuleRow, 2).Value ' get the rule as a wildcard string strWildcardRule = "*" & Join(Split(strRule, " "), "*") & "*" ' if the wildcarded rule is like the input string If strInput Like strWildcardRule Then ' break the loop as we have a match ' strOutput will be the sap code for the matching rule Exit For Else ' no match - set this output to empty string strOutput = vbNullString End If Next lngRuleRow ' if output string is not empty then update the row for this card type If strOutput <> vbNullString Then ' set the sapcode in the output range rngOutput.Cells(lngInputRow, 1).Value = strOutput End If ' next card type in input range Next lngInputRow End Sub 

注意我使用Option Compare Text的情况下,如果匹配,但不同的大小写在Like任何一方。 检查Like的链接:

选项比较基于按系统区域设置确定的不区分大小写的文本sorting顺序进行string比较的文本结果。 当使用选项比较文本对相同的字符进行sorting时,将生成以下文本sorting顺序:A = a)<( – =à)<(B = b)<(E = e)<(ε=ê)<(Z = z)<(Ø=ø)