如何使用VBA在Excel中的单个列(A)中搜索字符串

时间:2012-01-11 11:11:55

标签: excel-vba vba excel

我想将excel VBA代码中的这些行更改为更快的代码,而不是遍历所有行,我确实看到了示例但无法理解它们,因为我不是VBA用户。

当我使用示例中的代码(谷歌,这个网站)时,我看不到我想要的正确需求,我想搜索列A,如果找到的值返回搜索值旁边的列B中的值,否则返回空。

我使用的大多数代码在找不到时都会返回错误以及其他一些神秘的行为。

我目前要搜索的代码是:

Dim k As Integer
For k = 2 To sheet2Counter - 1                      
    Dim tmp As String                      

    tmp = ActiveSheet.Range("A" & k).Value                      
    If tmp = tmpstr Then                      
        tmp = ActiveSheet.Range("B" & k).Value                      
        tmp = Replace(tmp, "Q", "A")                      
        mainstringtopaste = mainstringtopaste + tmp + ","

            Exit For                      
    End If                    
Next k

另请告诉我这是否是一种更好的方式或任何代替它的代码更快。

要搜索的工作表中的列如下:

ColumnA        ColumnB
trees          leaves
oranges        fruits
pineapple      fruits
leaves         trees

因此,我的上述代码应该搜索树,并且应该返回树叶......

谢谢

1 个答案:

答案 0 :(得分:13)

以下两种优于循环的方法。两者都处理“无法找到”的情况。

  1. 如果变量不存在,则错误处理的正常函数VLOOKUP的VBA等效(INDEX/MATCH可能是比VLOOKUP更好的路由,即如果您的两列A和B是相反的顺序,或相距很远)
  2. VBAs FIND方法(匹配A列中的整个字符串,因为我使用xlWhole参数)

    Sub Method1()
    Dim strSearch As String
    Dim strOut As String
    Dim bFailed As Boolean
    
    strSearch = "trees"
    
    On Error Resume Next
    strOut = Application.WorksheetFunction.VLookup(strSearch, Range("A:B"), 2, False)
    If Err.Number <> 0 Then bFailed = True
    On Error GoTo 0
    
    If Not bFailed Then
    MsgBox "corresponding value is " & vbNewLine & strOut
    Else
    MsgBox strSearch & " not found"
    End If
    End Sub
    
    Sub Method2()
        Dim rng1 As Range
        Dim strSearch As String
        strSearch = "trees"
        Set rng1 = Range("A:A").Find(strSearch, , xlValues, xlWhole)
        If Not rng1 Is Nothing Then
            MsgBox "Find has matched " & strSearch & vbNewLine & "corresponding cell is " & rng1.Offset(0, 1)
        Else
            MsgBox strSearch & " not found"
        End If
    End Sub