我的一堆大范围的vba代码使用worksheetfunction.vlookup来查找所需的值。然而,范围可以超过25,000个细胞,所以这需要永远。数组是否有等效函数?
我已经看到很多SO答案,似乎解决了返回true / false的确切字符串匹配。我需要字符串的位置。
答案 0 :(得分:0)
这个怎么样......
Function MyVLook(Arg As Range, Target As Range, ColIdx As Integer) As Range
Dim Idx As Integer
If Arg = "" Then
Set MyVLook = [ParamNothing]
Else
For Idx = 1 To Target.Rows.Count
If Target(Idx, 1) = Arg Then
If ColIdx < 0 Then
Set MyVLook = Target(Idx, 1).Offset(0, ColIdx)
Else
Set MyVLook = Target(Idx, ColIdx)
End If
Exit For
End If
Next Idx
End If
End Function
[ParamNothing]是包含一些特定于应用程序的文本的工作表中的单个单元格范围;否则这几乎就像普通的VLOOKUP ......你可以指定负列偏移(我经常在常规VLOOKUP中遗漏的东西),而且我没有内置范围搜索的标志。
答案 1 :(得分:0)
如果你只想找到第一次出现,试试这个:
Public Sub FindInRange()
Dim sValueToFind As String
Dim rRangeToSearch As Range
Dim rFoundRange As Range
sValueToFind = "The value I'm searching for"
With ThisWorkbook.Worksheets("Sheet1")
Set rRangeToSearch = .Range("A1:A1193")
Set rFoundRange = rRangeToSearch.Find( _
What:=sValueToFind, _
After:=rRangeToSearch.Cells(1, 1), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not rFoundRange Is Nothing Then
MsgBox sValueToFind & " found in cell " & rFoundRange.Address & _
" and the value two cells to the right is " & rFoundRange.Offset(, 2), vbInformation + vbOKOnly
Else
MsgBox sValueToFind & " not found.", vbInformation + vbOKOnly
End If
End With
End Sub
由于LookAt:= xlWhole,这将找到完全匹配,并且由于MatchCase而导致的情况不匹配:= False。如果要查找最后一次出现,请使用SearchDirection:= xlPrevious。
这模仿工作表上的Ctrl + F. 有关VBA FIND的更多信息,请参阅:https://msdn.microsoft.com/en-us/library/office/ff839746.aspx