VBA Vlookup для нескольких ячеек или диапазона

#excel #vba

#excel #vba

Вопрос:

У меня не так много знаний о VBA. А также слабый английский.

Приведенный ниже код предназначен для результата ВПР в одной ячейке, который работает хорошо, но теперь мне также нужны значения ВПР для диапазона («B1: B10») (соседний столбец).

Моя таблица VLOOKUP: — ThisWorkbook.Листы («имя_элемента»).Диапазон («D2: G10001»)

Номер индекса столбца: 3

Результат, который мне нужен: если я ввожу сумму в любую ячейку диапазона («A1: A10»), и если значение найдено в таблице VLOOKUP, то значение третьего столбца из таблицы VLOOKUP должно отображаться в соседней ячейке диапазона («B1: B10»)

Например: если я ввожу что-то в диапазоне A3, результат vlookup должен отображаться в диапазоне B3.

     Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngCell As Range, m, v
    Dim rngCell1 As Range, m1, v1
Check1:
    If Application.Intersect(Target, Range("A1:A10")) Is Nothing Then GoTo Check2:
    
    For Each rngCell In Range("A1:A10")
        v = rngCell.Value
        If Len(v) > 0 Then

            'See if the value is in your lookup table
            m = Application.VLookup(v, _
                 ThisWorkbook.Sheets("ItemName").Range("D2:G10001"), 2, False)

            'If found a match then replace wiht the vlookup result
            If Not IsError(m) Then rngCell.Value = m
End If
    Next
Exit Sub

Check2:
End Sub
  

Комментарии:

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

2. Нет, сэр, я не разбираюсь в кодировании, приведенный выше код также можно получить с этого сайта. Пожалуйста, помогите мне.

Ответ №1:

Думаю, это делает то, что вы хотите. Я также реструктурировал код, чтобы избежать ошибок.

Я также отключил события, чтобы избежать бесконечного цикла (не уверен, как вы сами этого избежали).

 Private Sub Worksheet_Change(ByVal Target As Range)

Dim rngCell As Range, m1 As Variant, m2 As Variant

If Application.Intersect(Target, Range("A1:A10")) Is Nothing Then Exit Sub

For Each rngCell In Intersect(Target, Range("A1:A10"))
    If Len(rngCell.Value) > 0 Then
        m1 = Application.VLookup(rngCell.Value, Range("D2:G10001"), 2, False)
        m2 = Application.VLookup(rngCell.Value, Range("D2:G10001"), 3, False)
        If Not IsError(m1) Then
            Application.EnableEvents = False
            rngCell.Value = m1
            rngCell.Offset(, 1).Value = m2
            Application.EnableEvents = True
        End If
    End If
Next

End Sub
  

Комментарии:

1. Уважаемый SRJ, спасибо за ваш любезный ответ, я не могу понять, почему он дает мне значение # N / A в диапазоне B1: B10.

2. Но я получаю правильное значение в диапазоне A1: A10.

3. Есть ли у вас NAs в столбце F?

4. Нет, сэр, листы («ItemName») Столбец F заполняется значением цены, пустых ячеек нет. и столбец G заполняются типом единицы измерения, без пустой ячейки.

5. Невероятно, у тебя талант уровня Бога. Снимаю шляпу перед гуру.