2017-04-10 109 views
1

我一直在试图找到类似的匹配来填充第一个屏幕截图中的空白Sapcode字段。在Excel中匹配类似VBA

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

我想通过匹配第二个屏幕截图中另一个卡类型列中的单词来查找第一个屏幕截图中卡类型值的Sapcode。 表缺少Sapcode S:

Input file i want to fill the sapcode

表用的匹配规则:

Rule Book Sheet

例如 - 对于输入文本签证/ 20160927/ET-奈/ 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 

上面的代码工作正常,如果有只是签证这意味着它将匹配签证,并给该第一搜索选项的领域,但它不检查的位置。如何更新我的代码以匹配所有单词?

回答

2

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

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

所以我们可以使用这个(在第一张截图Card Type)遍历所有的输入,并在第二次比较所有的“规则”(Card Type截图)。

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

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

哪些“规则”的内容分成数组,并重新加入,并包围,他们用*为通配符。所以:

visa Chennai 

变为:

*visa*Chennai* 

然后你可以使用Like操作。

该代码将适用于您提供的测试数据。我评论,所以你可以跟着:

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

选项比较基于由系统的语言环境决定的不区分大小写,文本排序顺序的字符串比较文本结果。当使用选项比较文本对相同字符进行排序时,会生成以下文本排序顺序:A = a)<(=à)<(B = b)<(E = e)<(Ê=ê)<(Z = z)<(Ø=ø)