Как передать параметр Range для функции VLookup? - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть две функции ниже в VBA.abb00 работает нормально, а abb11 - нет.

Мой вопрос: как передать переменную Range в качестве параметра для функции VLookup?

Function abb00() 'demo func
    abb00 = Application.WorksheetFunction.VLookup("a", _ 
        Worksheets("SheetCache").Range("A:B"), 2, False)
End Function

Function abb11() 'demo func
    rangeVar = Worksheets("SheetCache").Range("A:B")
    abb11 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Вы можете сделать это двумя способами

Исправление вашей функции
Ваша текущая функция не устанавливает переменную диапазона.Он будет работать следующим образом

Function abb11()
    Dim rangeVar as Range
    Set rangeVar = Worksheets("SheetCache").Range("A:B")
    abb11 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function

Передача диапазона в вашу функцию
В качестве альтернативы вы можете передать диапазон в функцию следующим образом

Sub GetRange()
    Dim rangeVar As Range
    Set rangeVar = Worksheets("SheetCache").Range("A:B")
    MsgBox abb2(rangeVar)
End Sub
Function abb2(ByVal rangeVar)
       abb2 = Application.WorksheetFunction.VLookup("a", rangeVar, 2, False)
End Function
3 голосов
/ 29 февраля 2012

Чтобы пройти диапазон, сначала нужно получить ссылку на диапазон.

У вас сейчас есть:

rangeVar = Worksheets("SheetCache").Range("A:B")

Это не получает диапазон; он считывает весь диапазон A:B в массив Variant. Если вы хотите получить ссылку на диапазон, вам нужно использовать ключевое слово Set.

Set rangeVar = Worksheets("SheetCache").Range("A:B")

По иронии судьбы это не влияет на вывод вашей функции abb11 ( EDIT: в Excel 2003 ), потому что VLookup может применяться как к массиву Variant, так и к Range. Однако чтение двух целых столбцов в массив довольно неэффективно, поэтому я бы предпочел получить ссылку на диапазон (Set rangeVar = ...). РЕДАКТИРОВАТЬ В Excel 2007/2010 чтение двух целых столбцов в массиве Variant, вероятно, приведет к смерти вашей функции, поскольку в Excel 2003 загружается миллион строк, а не 65536 в Excel 2003, как я и делал тестирование.

...