Почему я не могу передать Variant в качестве значения поиска в VBA VLookup? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь немного изучить VBA и надеюсь, что кто-то может что-то объяснить мне

Я запускаю vlookup в VBA, который принимает числовой индекс и возвращает соответствующее имя из диапазона листа. Если я передаю этот индекс как Variant, функция завершается ошибкой, но если я передаю Integer, она завершается успешно. Однако, если я изменю данные базового диапазона с числовых на буквенно-цифровые (например, с 1 на 1a), аргумент Variant сработает.

Почему vlookup не работает, когда получен аргумент Variant, а базовые данные числовые?

У меня есть лист, который выглядит так:
Lookup range setup

Эта функция поиска отлично работает

Sub LookupTest()
 Dim LookupValue As Integer
 Dim ReturnValue As Variant
 LookupValue = InputBox("Enter a value to lookup")
 Sheets("Sheet1").Activate
 ReturnValue = WorksheetFunction.VLookup(LookupValue, Range("A1:B4"), 2, False)
 MsgBox (ReturnValue)
End Sub

Но это не получится

Sub LookupTest()
    Dim LookupValue As Variant
    Dim ReturnValue As Variant
    LookupValue = InputBox("Enter a value to lookup")
    Sheets("Sheet1").Activate
    ReturnValue = WorksheetFunction.VLookup(LookupValue, Range("A1:B4"), 2, False)
    MsgBox (ReturnValue)
End Sub

1 Ответ

0 голосов
/ 14 сентября 2018

Сбой, потому что ваше поле ввода вставляет текст, похожий на число, в вариант, а "9" не равно 9. Вариант может быть либо текстом, либо числом, поэтому, если ему задан текст, который выглядит как число, это то, что вы получите. Целочисленный тип var не может быть текстом, похожим на число, поэтому накладные расходы VBA делают преобразование, и ваш первый пример работает.

Два варианта:

Во-первых, вы можете использовать application.inputbox, который позволяет вам возвращать истинное число, а не текст.

LookupValue = application.InputBox("Enter a value to lookup", type:=1)

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

ReturnValue = WorksheetFunction.VLookup(val(LookupValue), Range("A1:B4"), 2, False)
...