在vba中是否有一个等同于vlookup的数组?

时间:2015-04-09 10:04:48

标签: arrays string excel-vba vba excel

我的一堆大范围的vba代码使用worksheetfunction.vlookup来查找所需的值。然而,范围可以超过25,000个细胞,所以这需要永远。数组是否有等效函数?

我已经看到很多SO答案,似乎解决了返回true / false的确切字符串匹配。我需要字符串的位置。

2 个答案:

答案 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