2015-04-09 4 views
0

Мой код vba для большого диапазона использует workheetfunction.vlookup для поиска необходимых значений. Однако диапазоны могут превышать 25 000 ячеек, поэтому это длится вечно. Существует ли эквивалентная функция для массивов?Есть ли массив, эквивалентный vlookup в vba?

Я видел много ответов SO, которые, похоже, обращаются к возврату true/false, существует точное совпадение строк. Мне нужно расположение строки.

ответ

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), и я не построил флаг для поиска диапазона.

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