Excel VBA: Вопрос по функции VLookup

Автор Daniel_James, 30 апреля 2016, 11:47

Daniel_James

Здравствуйте. Необходимо произвести выборку по двум условиям (см. прикрепленный файл). На форме располагаются два Combobox. Задав нужные параметры в Combobox (данные берутся из excel) - в Label должно отобразиться нужно значение. При использовании функции VLookup возникает ошибка. Прошу помочь разобраться.

[вложение удалено администратором]

Администратор

Ошибка вот здесь:
    i = Application.WorksheetFunction.VLookup(sechenie, Sheet1.Range("B3:E8"), 2, False)

В вашем файле нет "Sheet1".

Если вы хотите использовать vba-имя листа (которое отображается в VBA, в окне "Project - ..."), то там у вас у листа имя "Лист1". В этом случае нужно так записать:
    i = Application.WorksheetFunction.VLookup(sechenie, Лист1.Range("B3:E8"), 2, False)

Если вы хотите использовать обычное имя листа, то тогда так:
    i = Application.WorksheetFunction.VLookup(sechenie, Worksheets("Лист1").Range("B3:E8"), 2, False)

Можно ещё обращаться к листу не по имени, а по порядковому номеру:
    i = Application.WorksheetFunction.VLookup(sechenie, Worksheets(1).Range("B3:E8"), 2, False)

Daniel_James

Я внёс изменения согласно вашему ответу, но всё равно происходит ошибка:
Run-time 1004  Невозможно получить VLookup свойство класса WorksheetFunction

Администратор

Здесь сразу два подводных камня:

  • свойство "ComboBox.Text" возвращает дробные числа с точкой, хотя на мониторе мы видим запятую. Поэтому нужно заменить точку на запятую;
  • после замены точки на запятую число всё ещё не будет числом как таковым, а будет иметь тип данных "String", а эксель-функция ВПР (в данном случае "VLookup") ведёт поиск с учётом типа данных. Поэтому нужно изменить тип данных "String" на "Double".
Таким образом, код будет такой:

Вариант 1
Private Sub CommandButton1_Click()
   
    ' Здесь у переменной "sechenie" тип данных "Double", что будет преобразовывать
        ' числа в виде текста в числа в виде чисел.
    Dim sechenie As Double
    Dim i As String
   
    sechenie = Replace(UserForm1.ComboBox2.Text, ".", ",")
    i = Application.WorksheetFunction.VLookup(sechenie, Worksheets("Лист1").Range("B3:E8"), 2, False)
    UserForm1.Label3.Caption = i
   
End Sub
[свернуть]
Вариант 2
Вариант с использованием vba-функции "Val". Она извлекает из текстовой строки числа до первого символа, который не является числом. Можно использовать эту функцию в данном случае, т.к. эта функция работает с дробными числами, у которых разделитель точка. И функция "Val" возвращает число в типе "Double".

Private Sub CommandButton1_Click()
   
    ' Здесь у переменной "sechenie" тип данных "Double", что будет преобразовывать
        ' числа в виде текста в числа в виде чисел.
    Dim sechenie As Double
    Dim i As String
   
    sechenie = Val(UserForm1.ComboBox2.Text)
    i = Application.WorksheetFunction.VLookup(sechenie, Worksheets("Лист1").Range("B3:E8"), 2, False)
    UserForm1.Label3.Caption = i
   
End Sub
[свернуть]

Какой вариант лучше, не знаю. Пробуйте любой.

Daniel_James