Нахождение значения слева Reverse Vlookup с помощью INDEX и MATCH VBA - PullRequest
1 голос
/ 13 марта 2019

Я видел много форумов, которые говорили, что можно найти данные в левом столбце, в отличие от функции Vlookup.

У меня есть лист, из которого я хотел бы получить значение слева. Другими словами, я хотел бы найти серийный номер справа, скажем, столбец 3, и получить значение в столбце 1.

Какая альтернатива Vlookup в VBA? (т.е. обратный просмотр)

Я видел несколько форумов с примерами использования индекса соответствия, но я не могу понять синтаксис. Может кто-нибудь дать мне простой пример?

Вот что я использовал раньше и обнаружил, что Vlookup не может искать влево:

Sal = Application.WorksheetFunction.VLookup("3491709101",Sheets(PreviousTabName).Range(ThisRAnge), 2, False)

Ответы [ 5 ]

0 голосов
/ 29 мая 2019

Синтаксис индекса соответствия VBA

Dim ReturnValueRange as range, LookupRange as range

Set ReturnValueRange = Thisworkbook.Sheets("Sheet1").range("$E$1:$E$7")
Set LookupRange = Thisworkbook.Sheets("Sheet1").range("$G$1:$G$7")

LookUpValue = "findMe"

Result = Application.WorksheetFunction.INDEX(ReturnValueRange,Application.WorksheetFunction.MATCH(LookUpValue, LookupRange, 0))

Синтаксис индекса совпадения FORMULA

=INDEX(ReturnValueRange,MATCH(LookUpValue, LookupRange, 0))

LEFT VLOOKUP Синтаксис VBA

  • Ошибка возврата не совпадает

Result = WorksheetFunction.VLOOKUP(LookUpValue, WorksheetFunction.CHOOSE(Array(1,2), LookupRange, ReturnValueRange), 2, 0))

ФОРМУЛА СЛЕДУЮЩЕГО VLOOKUP ФОРМУЛА

=VLOOKUP(LookUpValue, WorksheetFunction.CHOOSE({1,2}, LookupRange, ReturnValueRange), 2, 0))
  • функция «ВЫБРАТЬ» управляет двумя полями.
  • Вы назначаете ссылочные «индексные» номера диапазонам данных - присвоение LookupRange для индекса с номером 1 и ReturnValueRange для индекса с номером 2
  • Итак, когда вы набираете «2» в функции VLookup, вы на самом деле ссылаясь на индекс № 2 в функции ВЫБРАТЬ.
0 голосов
/ 13 марта 2019

Глядя на ваш комментарий к @Mistella, я не думаю, что вам нужно Vlookup или Match. Насколько я понимаю, вы хотите найти серийный номер "3491709101" в столбце 8 и установить значение от Columns(2) до переменной Sal. Если я прав, тогда вам нужна простая находка.

Dim rng As Range, findVal As Variant, Sal As Variant
Dim PreviousTabname As Worksheet, ThisRange As Range

Set rng = Sheets(PreviousTabname).Range(ThisRange)

    Set findVal = rng.Find(What:="3491709101", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
        If findVal Is Nothing Then
            Exit Sub
        Else: Sal = findVal.Offset(, -6).Value

        End If
    MsgBox Sal   
0 голосов
/ 13 марта 2019

Я хотел бы найти [sic] для серийного # справа, скажем, столбец 3, и получить значение в столбце 1.

Используйте Application.Match для получения номера строки. Использование Application.Index является своего рода излишним, поскольку Cells будет делать то же самое.

dim n as variant, val as variant

n = application.match("3491709101", Sheets(PreviousTabName).Range("C:C"), 0)

if not iserror(n) then
    val = Sheets(PreviousTabName).Cells(n, "A").Value
    debug.print val
end if
0 голосов
/ 13 марта 2019

Я бы заменил VLOOKUP на Application.Match, но вам нужно добавить сценарий обработки ошибок, на случай, если Application.Match не удастся.

Код

Option Explicit

Sub UseMatch()

Dim PreviousTabName As String
Dim SourceSht As Worksheet
Dim ThisRange As Range
Dim LastRow As Long, MatchRow As Variant
Dim Val

' set the worksheet object where you have the data you are trying to match it with
Set SourceSht = ThisWorkbook.Sheets("Sheet2") ' <-- modify "Sheet2" to your sheet's name

' set the range where you want to search for a Match
With SourceSht
    LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row ' find last row in column "C" , you can change to the column you need

    ' set dynamic Range
    Set ThisRange = .Range(.Cells(1, "C"), .Cells(LastRow, "C")) ' change the column to where your data you are trying to compare lies
End With

If Not IsError(Application.Match("3491709101", ThisRange, 0)) Then
    MatchRow = Application.Match("3491709101", ThisRange, 0) ' row of match found
    Val = SourceSht.Range("A" & MatchRow) ' getting the value 2 columns to the left of column "C"
    MsgBox Val
Else
    ' Match error, raise a msgbox
    MsgBox "Unable finding 3491709101 in range " & ThisRange.Address(0, 0, xlA1), vbCritical, "Error"
End If

End Sub

Примечание : при работе с числовыми значениями необходимо убедиться, что они отформатированы одинаково в обоих местах.

Например, вы ищете "3491709101", представляющее собой числовое значение, преобразованное в строку, поэтому, если исходные данные в ThisRange не настроены, совпадение (в виде строки) не будет выполнено.

0 голосов
/ 13 марта 2019

Я бы использовал комбинацию Index-Match. Примерно так должно работать:

Sal = Application.WorksheetFunction.INDEX(Sheets(PreviousTabName).Range(ThisRAnge),Application.WorksheetFunction.MATCH("3491709101",Application.WorksheetFunction.INDEX(Sheets(PreviousTabName).Range(ThisRAnge),0,3),0),1)

В качестве альтернативы, если ссылка на столбец 1 хранится в переменной 1stColumn, а в столбце 3 - 3rdColumn, тогда код должен быть:

Sal = Application.WorksheetFunction.INDEX(1stColumn,Application.WorksheetFunction.MATCH("3491709101",3rdColumn,0))
...