【问题标题】:Excel VB/Macro InStr Exact SearchExcel VBA/Macro InStr 精确搜索
【发布时间】:2018-05-11 23:48:38
【问题描述】:

我需要一些可以在 Excel 中搜索列并在搜索匹配时输出一些内容的东西。其中大部分都有效,但类似的值似乎不起作用。例如:

Sub ConvertComputerNames()

Dim SrchRng As Range, cel As Range

Set SrchRng = Range("A2:A200")

For Each cel In SrchRng
    If InStr(1, cel.Value, "W7ADH") Then
        cel.Offset(0, 7).Value = "LTW7ADH"
    End If
    If InStr(1, cel.Value, "ADH") Then
        cel.Offset(0, 7).Value = "LTW10ADH"
    End If

 Next cel

End Sub

在这种情况下,两者都将显示 LTW10ADH。有没有办法让它显示正确的值?我需要它是完全匹配的。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    如果 exact 匹配意味着单元格值必须 exactly 匹配给定的字符串,那么您将不会使用 Instr() 并仅比较单元格内容:

    Sub ConvertComputerNames()
    
        Dim SrchRng As Range, cel As Range
    
        Set SrchRng = Range("A2:A200")
    
        For Each cel In SrchRng
            If cel.Value = "W7ADH" Then
                cel.Offset(0, 7).Value2 = "LTW7ADH"
            End If
            If cel.Value = "ADH" Then
                cel.Offset(0, 7).Value2 = "LTW10ADH"
            End If
        Next
    
    End Sub
    

    在这种情况下,最合适的构造是If ... ElseIf ... End If

    For Each cel In SrchRng
        If cel.Value = "W7ADH" Then
            cel.Offset(0, 7).Value = "LTW7ADH"
        ElseIf cel.Value = "ADH" Then
            cel.Offset(0, 7).Value = "LTW10ADH"
        End If
    Next
    

    Select Case ... End Select 一个:

    For Each cel In SrchRng
        Select Case cel.Value
            Case "W7ADH"
                cel.Offset(0, 7).Value = "LTW7ADH"
            Case "ADH"
                cel.Offset(0, 7).Value = "LTW10ADH"
        End Select
    Next
    

    如果您确实需要 部分 匹配,那么 @KenWhite 指出了问题,另一种正确处理它的方法是再次通过 Select Case 构造:

    Sub ConvertComputerNames()
        Dim SrchRng As Range, cel As Range
    
        Set SrchRng = Range("A2:A200")
    
        For Each cel In SrchRng
            Select Case True
                Case InStr(1, cel.Value, "W7ADH")
                    cel.Offset(0, 7).Value = "LTW7ADH"
                Case InStr(1, cel.Value, "ADH")
                    cel.Offset(0, 7).Value = "LTW10ADH"
            End Select
        Next
    End Sub
    

    在第一个匹配Case 条件时,执行相应的代码,然后代码退出Select Case - End Select 块,因此需要按正确的顺序放置检查

    【讨论】:

    • 非常感谢!我选择了 If/ElseIf,它运行良好。
    【解决方案2】:

    他们当然会。您的第二个测试匹配第一个和第二个选项,因此第二个将始终适用。将其更改为 If..Else If ;如果第一个匹配成功,则永远不会执行第二个。

    Sub ConvertComputerNames()
    Dim SrchRng As Range, cel As Range
    
        Set SrchRng = Range("A2:A200")
    
        For Each cel In SrchRng
          If InStr(1, cel.Value, "W7ADH") Then
              cel.Offset(0, 7).Value = "LTW7ADH"
          Else If InStr(1, cel.Value, "ADH") Then
              cel.Offset(0, 7).Value = "LTW10ADH"
          End If
        Next cel
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多