Это вернет ссылку на последние три найденных предмета.
Затем вы можете использовать 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:
Введите код
Вы можете создать свой собственный 'MyVlookUp' как ** UDF **, и внутри вы просто будете использовать регулярный цикл 'For', который начинается с конца. И находит соответствие для каждой строки. –
Спасибо, Shai, я сначала проверю шаблон от Darren Bartrup-Cook. – Jimmy