我想将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
因此,我的上述代码应该搜索树,并且应该返回树叶......
谢谢
答案 0 :(得分:13)
以下两种优于循环的方法。两者都处理“无法找到”的情况。
VLOOKUP
的VBA等效(INDEX/MATCH
可能是比VLOOKUP
更好的路由,即如果您的两列A和B是相反的顺序,或相距很远) 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