2017-02-03 4 views
-1
  • Как создать VB Vlookup, который найдет последний матч или последний матч 3?
  • поиска из нижней части моего диапазона B4:B9999

Я попытался:VB Vlookup, который найдет последний матч

Private Sub FindRecord_Click() 

Label21 = Application.WorksheetFunction.VLookup(ComboBox3.Value, Worksheets("Transactions").Range("B4:P9999"), 1, False) 
Label21 = Application.WorksheetFunction.VLookup(ComboBox3.Value, Worksheets("Transactions").Range("B4:P9999"), 2, False)*** 

End Sub 
Private Sub UserForm_Initialize() 
ComboBox3.RowSource = "'[TEST46.xlsm]Transactions'!B4:B9999"** 
End Sub 

Я попытался Google вокруг, те Предложенное решение достаточно для первенствовать ВПР или не работает.

+0

Вы можете создать свой собственный 'MyVlookUp' как ** UDF **, и внутри вы просто будете использовать регулярный цикл 'For', который начинается с конца. И находит соответствие для каждой строки. –

+0

Спасибо, Shai, я сначала проверю шаблон от Darren Bartrup-Cook. – Jimmy

ответ

0

Это вернет ссылку на последние три найденных предмета.
Затем вы можете использовать OFFSET для возврата значений из соседних ячеек.
Код немного грязный и, вероятно, может быть улучшен, но он дает вам эту идею.

Public Sub Test() 

    Dim MyRange As Range 
    Dim rCell As Range 

    'Look for the value 4 in second column of Sheet3. 
    Set MyRange = Find_Last_Three(4, Sheet3.Columns(2)) 

    If Not MyRange Is Nothing Then 
     For Each rCell In MyRange 
      'Print the values from the 2 cells to the right of the found cells. 
      Debug.Print rCell.Offset(, 1) & " : " & rCell.Offset(, 2) 
     Next rCell 
    End If 

End Sub 

Public Function Find_Last_Three(ValueToFind As Variant, RangeToLookAt As Range) As Range 

    Dim rFound As Range 
    Dim rReturnedRange As Range 
    Dim sFirstAddress As String 
    Dim x As Long 

    With RangeToLookAt 
     Set rFound = .Find(What:=ValueToFind, _ 
          After:=.Cells(1, 1), _ 
          LookIn:=xlValues, _ 
          LookAt:=xlWhole, _ 
          SearchDirection:=xlPrevious) 
     If Not rFound Is Nothing Then 
      Set rReturnedRange = rFound 
      sFirstAddress = rFound.Address 
      For x = 1 To 2 
       Set rFound = .FindPrevious(rFound) 
       If rFound.Address <> sFirstAddress Then 
        Set rReturnedRange = Union(rReturnedRange, rFound) 
       End If 
      Next x 
     End If 
    End With 

    Set Find_Last_Three = rReturnedRange 

End Function 

EDIT:
Чтобы поместить код на практике на UserForm:

  • Создайте выпадающий под названием ComboBox3.
  • Создайте ярлык под названием Label1. Убедитесь, что метка широкая и достаточно высокая, чтобы отображать все ваши данные (три строки).

Добавьте этот код в UserForm
(вы должны еще Find_Last_Three в модуле Вы можете удалить Test, если вы хотите.):

Private Sub UserForm_Initialize() 
    Me.ComboBox3.RowSource = "Transactions!B4:B9999" 
End Sub 

Private Sub ComboBox3_Change() 
    Dim rLastThree As Range 
    Dim rCell As Range 

    Set rLastThree = Find_Last_Three(Me.ComboBox3.Value, Range(Me.ComboBox3.RowSource)) 

    If Not rLastThree Is Nothing Then 
     Me.Label1.Caption = "" 
     For Each rCell In rLastThree 
      Me.Label1.Caption = Me.Label1.Caption & rCell.Offset(, 1) & " : " & rCell.Offset(, 2) & vbCr 
     Next rCell 
    End If 
End Sub 

Примечание: rCell.Offset(,1) и rcell.Offset(,2) где это получение дополнительная информация от - смещение от столбца B на 1 и 2 столбца.

С моим, например, данные возвращает этот результат, показывающий последние три вхождения H были на строках 11, 15 и 18:
enter image description here Введите код

+0

Привет, Даррен, надеюсь, что вы можете вести меня? Я не могу найти никакого результата на «'Распечатайте значения из 2-х ячеек справа от найденных ячеек». после выполнения выше, имитируя Sheet3 с вариантом – Jimmy

+0

. Я обновил свой ответ, чтобы показать, как код может использоваться в форме. У вашего исходного кода, похоже, есть ярлык и поле со списком, поэтому они были использованы. –

+0

1000 Спасибо Даррену, я обязательно испытаю на нем и прокомментирую. Это очень ценная акция, так как я не могу найти другого доступа к интернету. – Jimmy