Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: Daniel_James от 30 апреля 2016, 11:47

Название: Excel VBA: Вопрос по функции VLookup
Отправлено: Daniel_James от 30 апреля 2016, 11:47
Здравствуйте. Необходимо произвести выборку по двум условиям (см. прикрепленный файл). На форме располагаются два Combobox. Задав нужные параметры в Combobox (данные берутся из excel) - в Label должно отобразиться нужно значение. При использовании функции VLookup возникает ошибка. Прошу помочь разобраться.

[вложение удалено администратором]
Название: Re: Excel VBA: Вопрос по функции VLookup
Отправлено: Администратор от 30 апреля 2016, 11:58
Ошибка вот здесь:
    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)
Название: Re: Excel VBA: Вопрос по функции VLookup
Отправлено: Daniel_James от 30 апреля 2016, 12:03
Я внёс изменения согласно вашему ответу, но всё равно происходит ошибка:
Run-time 1004  Невозможно получить VLookup свойство класса WorksheetFunction
Название: Re: Excel VBA: Вопрос по функции VLookup
Отправлено: Администратор от 30 апреля 2016, 12:05
Здесь сразу два подводных камня:
Таким образом, код будет такой:

Вариант 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
[свернуть]

Какой вариант лучше, не знаю. Пробуйте любой.
Название: Re: Excel VBA: Вопрос по функции VLookup
Отправлено: Daniel_James от 30 апреля 2016, 12:29
Спасибо, вопрос решен