2012-01-11 157 views
3

我想将我的excel VBA代码中的这些行更改为更快的事情,而不是循环遍历所有行,我看过示例但无法了解他们,因为我不是VBA用户。如何使用VBA在excel中的单个列(A)中搜索字符串

当我使用示例代码(谷歌,本网站)时,我没有看到我想要的正确需求,我想搜索列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 

所以作为我上面的代码中,树应搜索和叶应当返还......

谢谢

+0

你在找什么样的价值观在列A中,你是匹配整个或部分字符串等?在发现所有变量的情况下,我发现它很难读取当前的代码。 – brettdj 2012-01-11 11:40:59

+0

@brettdj它每个单元格一个字符串,所以我会说整个字符串。也亲切地看到上面我已经更新了描述。谢谢 – confusedMind 2012-01-11 11:46:59

+0

谢谢 - 树会出现一次还是多次? – brettdj 2012-01-11 11:53:02

回答

11

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

  1. 的VBA等效正常功能VLOOKUP与错误处理如果变量不存在(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 
    
+0

正是我需要的,非常感谢。 – confusedMind 2012-01-11 12:11:48

+0

一条查询是这条线“Set rng1 = Range(”A:A“)。Find(strSearch,,xlValues,xlWhole)” 我觉得这行代码将我带到工作表并且搜索对我来说是可见的我可以看到细胞越来越选择等,如何隐藏它?我的意思是我在文本框中显示我的过程进度,但它需要我的工作表和显示不同的列获取选择等... 谢谢 – confusedMind 2012-01-11 12:31:43

+0

@confusedMind当然要求走了。不 - 我的代码中没有“选择”或“激活”注释,所以它不会做任何突出显示。 – brettdj 2012-01-11 12:34:40

相关问题