Функция VLookup в VBA - возвращает значение отдела на основе значения имени - PullRequest
0 голосов
/ 26 марта 2019

Я хочу вернуть значение отдела, основанное на значении имени. Список имен импортируется от стороннего поставщика, который каждый раз рандомизирует заказ, поэтому я не могу установить значение отдела для указанной ячейки. У меня есть диапазон данных (dim rng), который имеет имя и столбец A, а также отдел в столбце B. Я хотел бы, чтобы отдел, связанный с именем, был возвращен с тем же на новом листе. Я приложил свой код, но получаю ошибку приложения или объекта, и я не знаю, почему.

Sub find()

Dim namerng As Range
Dim rng As Range
Dim depti As Integer
Dim dept As String

Set namerng = Range("A1:A250") 'range of names
Set rng = Sheet1.Range("A1:B250") 'range of names in col A and dept in col B

    For depti = 3 To 250
     dept = "=IfError(Vlookup(namerng,rng,2,FALSE), "")"
     Range("B" & depti) = dept

    Next

End Sub

Ответы [ 2 ]

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

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

Sub find()

Dim rng As Range
Dim depti As Integer
Dim dept As String

Set rng = Sheet1.Range("A1:B250") 'range of names in col A and dept in col B

    For depti = 3 To 250
     dept = "=IfError(Vlookup(A" & depti & ",'" & Sheet1.Name & "'!" & rng.Address & ",2,FALSE), """")"
     Range("B" & depti) = dept
    Next

End Sub

Примечания

Я исключил переменную namerng, потому что она не нужна для обновленного уравнения.Так как VLookup принимает только одно значение в качестве первого параметра, это значение должно зависеть от значения переменной цикла, так же как и диапазон назначения.

Я также избежал кавычек, чтобы функция моглабыть действительным и добавленным в имя листа1.Так, чтобы адрес диапазона указывал на правильный лист (с одинарными кавычками, если в имени листа есть пробел).

Предупреждение:как это закодировано, уравнение будет вставлено в тот лист, который является активным во время выполнения кода.Это означает, что если Sheet1 активен, отделы будут перезаписаны циклической формулой.

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

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

Sub find()

    Dim namerng As Range 'List of Randomly Organized Names Only
    Dim Lookuprng As Range 'List of Names and Departments
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet

    Set sh1 = ThisWorkbook.Worksheets(1) 'List of Randomly Organized Names Only
    Set sh2 = ThisWorkbook.Worksheets(2) 'List of Names and Departments

    'List of Names and Departments
    sh1.Activate
    Set Lookuprng = sh1.Range(Cells(1, 1), (Cells(Rows.Count, 2).End(xlUp)))

    'List of Randomly Organized Names Only  ******NEED TO SPECIFY WHERE THESE NAMES ARE COMING FROM, I used Sheet1
    sh2.Activate
    Set namerng = sh2.Range(Cells(1, 1), (Cells(Rows.Count, 1).End(xlUp)))

    'Put correct department with name
    namerng.Offset(0, 1) = Application.VLookup(namerng, Lookuprng, 2, False)

End Sub
...