Здравствуйте. Необходимо произвести выборку по двум условиям (см. прикрепленный файл). На форме располагаются два 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)
Я внёс изменения согласно вашему ответу, но всё равно происходит ошибка:
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
Какой вариант лучше, не знаю. Пробуйте любой.
Спасибо, вопрос решен