Проблемы с VLookup и возможные решения - PullRequest
1 голос
/ 14 июля 2020

это мой первый пост, который я собираю, но я использовал его в своей работе в течение нескольких лет. Это оказалось бесценным справочником для новичка VBA ie, такого как я. У меня есть большой рабочий лист, который используется для составления списков и отображения рабочего времени персонала. Я пытаюсь использовать vlookup в приведенном ниже коде, чтобы сгенерировать контактный номер и сведения о поставщике известных оперативников, но пока это легко, но скажем, что строка была заполнена данными об оперативнике, которого нет в таблице vlookup (это часто случай), если я нажму на детали после факта или скопирую деталь в ячейку, vlookup запустит и удалит введенную вручную деталь. В основном я хочу, чтобы Excel запускал vlookup только в том случае, если есть совпадение, и если он обнаруживает ошибку, чтобы оставить только введенные вручную данные. вот что у меня есть на данный момент.

Private Sub worksheet_change(ByVal Target As Range)

Dim RNG1 As Range
Dim RNG2 As Range
Dim RNG3 As Range

Set RNG1 = Sheet1.Range("A1:A30") 'RANGES WHERE AN OPERATIVE NAME IS PLACED
Set RNG2 = Sheet1.Range("DQ:D30")
Set RNG3 = Sheet81.Range("G1:G30")

If Not Intersect(Target, Union(RNG1, RNG2, RNG3)) Is Nothing Then
    Set MyRange = Sheet1.Range("A2:C497") 'TABLE WHERE VLOOKUP DATA IS STORED ON SEPERATE SHEET

    Target.Offset(0, 2) = Application.IfError(Application.VLookup(Target.Value, MyRange, 3, False), "")
    Target.Offset(0, 1) = Application.IfError(Application.VLookup(Target.Value, MyRange, 2, False), "")
End If
Exit Sub

введите описание изображения здесь

1 Ответ

0 голосов
/ 14 июля 2020

Я использовал здесь Find, поскольку Match не будет работать с диапазоном из нескольких столбцов.

Private Sub worksheet_change(ByVal Target As Range)

Dim RNG1 As Range
Dim RNG2 As Range
Dim RNG3 As Range
Dim r As Range

Set RNG1 = Sheet1.Range("A1:A30") 'RANGES WHERE AN OPERATIVE NAME IS PLACED
Set RNG2 = Sheet1.Range("D1:D30")
Set RNG3 = Sheet81.Range("G1:G30")

If Not Intersect(Target, Union(RNG1, RNG2, RNG3)) Is Nothing Then
    Set MyRange = Sheet2.Range("A2:C497") 'TABLE WHERE VLOOKUP DATA IS STORED ON SEPERATE SHEET
    Set r = Union(RNG1, RNG2, RNG3).Find(what:=Target.Value, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
    If Not r Is Nothing Then   'name is found
        Target.Offset(0, 2) = Application.VLookup(Target.Value, MyRange, 3, False)
        Target.Offset(0, 1) = Application.VLookup(Target.Value, MyRange, 2, False)
    End If
End If

End Sub
...