Невозможно получить свойство vlookup класса worksheetfunction ошибка

 

Доброй ночи.  
Люди добрые, подскажите, почему ошибку 1004 ловлю?  
Использую вот такое выражение, вроде всё по правилам:  
Cells(i, f).Value = WorksheetFunction.VLookup(Cells(i, 2).Value, Range(Columns(14), Columns(19)), f + 5, False)

 

а где приложенный файл с примером?  

  P.S. 1004 — своеобразная ошибка и скорее всего она не относится к коду никак (т.е. код правильный и причина в чём-то другом)

 

У вас, скорее всего, ячейка пустая тут Cells(i, 2).Value

 

Я попробовал ваш код (со своими переменными), всё нормально работает. Но если ячейка по адресу Cells(i, 2).Value пустая, то выскакивает ошибка 1004

 

приложил файл, всё равно не работает независимо от того, пустая ли ячейка, или нет  

  Sub asdf()  
i = 1  
f = 3  

  Do While i <> 6  
Do While f <> 6  
s = Cells(i, 2).Value  
Cells(i, f).Value = Application.WorksheetFunction.VLookup(s, Range(Columns(7), Columns(11)), f + 5, True)  
f = f + 1  
Loop  
i = i + 1  
Loop  

    End Sub

 

«невозможно получить свойство vlookup класса worksheetfunction» — такая ошибка

 

Заработал код ниже: ошибки нашёл, вроде понял.    

  Если только небольшой ликбез кто-то сможет устроить. Чем отличается Application.VLookup от Application.WorksheetFunction.VLookup. Что за принцип?  

  Sub asdf()  
i = 1  
f = 3  

  Do While i <> 7  
Do While f <> 7  
s = Cells(i, 2).Value  
f1 = f + 5  
sDescript = Application.VLookup(s, Range(Columns(7), Columns(11)), f — 1, False)  
Cells(i, f).Value = IIf(IsError(sDescript), «», sDescript)  

  f = f + 1  

  Loop  
i = i + 1  
f = 3  
Loop  

  End Sub

 

Если честно, то я не понимаю, что вы хотите. Может вы сами запутались в своих переменных и циклах?  

  Смотрите приложенный файл. Там рабочий код. Никаких ошибок не выскакивает.  
На лицо ваше непонимание кода, циклов, переменных и т.д.  

  Sub asdf()  
Dim i As Long, f As Long, s As String, n As Long  

         For i = 1 To 6  
       n = 1  
       For f = 3 To 6  
           Cells(i, f) = Application.VLookup(Cells(i, 2).Value, Range(«G:K»), n + 1, False)  
           n = n + 1  
       Next f  
   Next i  
   MsgBox «Конец!», vbInformation, «Конец»  
End Sub

 

и в ВПР для поиска точного соответствия лучше использовать в 4-м аргументе «ЛОЖЬ», а не «ИСТИНА»

 

широкарека

Гость

#10

29.08.2010 05:28:04

ошибка была в том, что если использовать Application.WorksheetFunction.VLookup, то возникающая ошибка, видимо не пишется в переменную/ячейку, а препятствует исполнению кода.  

  Если использовать Application.VLookup, если получаем н/д, можем её отследить и поправить.  

  + Отступ назначался абсолютным, а не относительным первой колонке диапазона, поэтому Н/Д вылезала всегда — глупая ошибка  

  И, да, да, цикл был неправильный, пример делал второпях, простите.  

  Так что такое WorksheetFunction, и почему такое воздействие оказывает на функцию?

I had an issue with this code before and when I tried fixing it another issue occurred. On this line of code,

If Not (IsError(Application.WorksheetFunction.VLookup(item, lookup_range, 2, False))) Then 

I get the error unable to get the vlookup property of the worksheetfunction class»

The whole code is below. Thanks for any help!

Sub code()
Columns("E:G").Insert shift:=xlToRight, copyorigin:=xlFormatFromLeftOrAbove
Range("E6").value = "Drink Price"
Range("F6").value = "Drink Revenue"
Range("G6").value = "Gross Sales less Drink Revenue"
Dim i As Variant
Dim item As Variant
Dim lookup_range As Range
Dim rev_wksht As Worksheet
Dim rev_wbk As Workbook
Dim vlkup_wbk As Workbook
Set rev_wksht = ActiveWorkbook.Sheets(1)
Set vlkup_wbk = Workbooks.Open("C:\Users\user\Documents\vlookup table drink prices.xlsx")
Set lookup_range = vlkup_wbk.Worksheets("Sheet1").Range("A:B")
i = 7
Do While rev_wksht.Cells(i, 1).value <> ""
   Set item = rev_wbk.Sheets(1).Cells(i, 1).value
    If Not (IsError(Application.WorksheetFunction.VLookup(item, lookup_range, 2, False))) Then
        rev_wksht.Cells(i, 5).value = Application.WorksheetFunction.VLookup(item, lookup_range, 2, False)
        rev_wksht.Cells(i, 6).Formula = rev_wksht.Cells(i, 11).value * rev_wksht.Cells(i, 5).value
        rev_wksht.Cells(i, 7).Formula = rev_wksht.Cells(i, 4).value - rev_wksht.Cells(i, 6).value
    ElseIf (IsError(Application.WorksheetFunction.VLookup(item, lookup_range, 2, False))) Then
        rev_wksht.Cells(i, 5).value = Empty
    End If
i = i + 1
Loop
rev_wksht.Range("F:G").NumberFormat = "#,##0.00"
rev_wksht.Cells.EntireColumn.AutoFit
End Sub

I am trying to develop a form to track invoices as they come in. The form will have a combobox where I can click on and select a vendor number. I want the textbox to automatically fill in based on the vendor number selected from the combobox. Here’s what I have so far:

Private Sub ComboBox1_Change()    
    'Vlookup when ComboBox1 is filled
    Me.TextBox1.Value = Application.WorksheetFunction.VLookup( _
        Me.ComboBox1.Value, Worksheets("Sheet3").Range("Names"), 2, False)    
End Sub

Worksheet 3 is from which the information is being drawn (the vendor number and name).

When I go back to the form to test the code, I get the following error:

Run-time error ‘1004’: Unable to get the VLookup property of the WorksheetFunction class

How do I fix this?

Jean-François Corbett's user avatar

asked Oct 9, 2013 at 19:05

user2864307's user avatar

1

Try below code

I will recommend to use error handler while using vlookup because error might occur when the lookup_value is not found.

Private Sub ComboBox1_Change()


    On Error Resume Next
    Ret = Application.WorksheetFunction.VLookup(Me.ComboBox1.Value, Worksheets("Sheet3").Range("Names"), 2, False)
    On Error GoTo 0

    If Ret <> "" Then MsgBox Ret


End Sub

OR

 On Error Resume Next

    Result = Application.VLookup(Me.ComboBox1.Value, Worksheets("Sheet3").Range("Names"), 2, False)

    If Result = "Error 2042" Then
        'nothing found
    ElseIf cell <> Result Then
        MsgBox cell.Value
    End If

    On Error GoTo 0

answered Oct 9, 2013 at 19:09

Santosh's user avatar

SantoshSantosh

12.2k4 gold badges41 silver badges73 bronze badges

1

I was having the same problem. It seems that passing Me.ComboBox1.Value as an argument for the Vlookup function is causing the issue. What I did was assign this value to a double and then put it into the Vlookup function.

Dim x As Double
x = Me.ComboBox1.Value
Me.TextBox1.Value = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet3").Range("Names"), 2, False) 

Or, for a shorter method, you can just convert the type within the Vlookup function using Cdbl(<Value>).

So it would end up being

Me.TextBox1.Value = Application.WorksheetFunction.VLookup(Cdbl(Me.ComboBox1.Value), Worksheets("Sheet3").Range("Names"), 2, False) 

Strange as it may sound, it works for me.

Hope this helps.

answered Sep 16, 2014 at 17:43

Omar Khan's user avatar

Omar KhanOmar Khan

811 silver badge3 bronze badges

I was just having this issue with my own program. I turned out that the value I was searching for was not in my reference table. I fixed my reference table, and then the error went away.

answered Feb 11, 2015 at 14:01

mjpowers0903's user avatar

Простой ВПР двух таблиц макросом

w00t

Дата: Четверг, 26.05.2016, 21:34 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 131


Репутация:

3

±

Замечаний:
0% ±


Сделал так

[vba]

Код

Sub Test()
    Dim rng As Range
    Dim i As Long

    With ActiveSheet
        Set rng = .Range(«C1:C» & .Cells(.Rows.Count, 3).End(xlUp).Row)

        For i = 5 To rng.Rows.Count
            rng.Cells(i, 6) = Application.WorksheetFunction.VLookup(ActiveSheet.Cells(i, 3), Sheets(«Лист2»).Range(«A:C»), 3, False)
        Next
    End With
End Sub

[/vba]

— работает. Но ущербно. Например, если на втором листе не будет совпадений по просматриваемому столбцу — то вылетит с ошибкой «Невозможно получить свойство Vlookup класса WorksheetFunction. А вместо этого поставить бы прочерк (если не найдено совпадений). Возможно еще что-то не так.

Посоветуйте, как оптимизировать код. Нужно то, что визуально в приложенной книге. Только диапазоны динамические и средней степени величины, по этой причине ищу последнюю строку. Вообще, была идея навесить на Worksheet.SelectionChange, поэтому пытаюсь понять, как сделать оптимальнее и проще.

К сообщению приложен файл:

6920410.xlsm
(19.1 Kb)

Сообщение отредактировал w00tЧетверг, 26.05.2016, 21:41

 

Ответить

Manyasha

Дата: Четверг, 26.05.2016, 21:52 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

w00t, так хотите?
[vba]

Код

Sub Test()
    Dim rng As Range
    Dim i As Long

    With ActiveSheet
        Set rng = .Range(«C1:C» & .Cells(Rows.Count, 3).End(xlUp).Row)
        On Error Resume Next
        For i = 5 To rng.Rows.Count
            rng.Cells(i, 6) = Application.WorksheetFunction.VLookup(ActiveSheet.Cells(i, 3), _
                Sheets(«Лист2»).Range(«A2:C» & Sheets(«Лист2»).Cells(Rows.Count, 1).End(xlUp).Row), 3, False)
            If Err <> 0 Then rng.Cells(i, 6) = «-«: Err.Clear
        Next
    End With
End Sub

[/vba]
А чем формула не угодила?


ЯД: 410013299366744 WM: R193491431804

 

Ответить

_Boroda_

Дата: Четверг, 26.05.2016, 22:00 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16620


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Еще вариант
[vba]

Код

Sub tt()
    Application.ScreenUpdating = 0
    r11_ = Sheets(«Лист2»).Range(«A» & Rows.Count).End(3).Row
    r1_ = Range(«C» & Rows.Count).End(3).Row
    r0_ = 5
    Range(«D» & r0_).Resize(r1_ — r0_ + 1).FormulaR1C1 = _
        «=IFERROR(VLOOKUP(RC[-1],Лист2!R2C[-3]:R» & r11_ & «C[-1],3,0),»»-«»)»
    Range(«D» & r0_).Resize(r1_ — r0_ + 1).Copy
    Range(«D» & r0_).Resize(r1_ — r0_ + 1).PasteSpecial (xlPasteValues)
    Application.CutCopyMode = 0
End Sub

[/vba]

Формулой (в коде или сразу на листе) — долго

Вы знаете, сомнения смутные меня гнетут, что макрос будет быстрее формулы. В макросе-то тот же VLOOKUP. Проверить можно, но лениво.


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

w00t

Дата: Четверг, 26.05.2016, 22:01 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 131


Репутация:

3

±

Замечаний:
0% ±


Да,так, спасибо :)
Формулой (в коде или сразу на листе) — долго, как минимум (на среднем диапазоне). И диапазон динамический, только первая строка фиксирована.
Очень редко пользуюсь именно таким способом, бывает необходим. Обычно для небольших диапазонов формула, либо для очень больших — более специализированная штука есть.

 

Ответить

w00t

Дата: Четверг, 26.05.2016, 22:50 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 131


Репутация:

3

±

Замечаний:
0% ±


Спасибо, поправил на свой диапазон

[vba]

Код

Sub tt()
    Application.ScreenUpdating = 0
    r11_ = Sheets(«Лист2»).Range(«A» & Rows.Count).End(3).Row
    r1_ = Range(«C» & Rows.Count).End(3).Row
    r0_ = 5
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).FormulaR1C1 = _
        «=IFERROR(VLOOKUP(RC[-5],Лист2!R2C[-7]:R» & r11_ & «C[-5],3,0),»»-«»)»
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).Copy
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).Copy
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).PasteSpecial (xlPasteValues)
    Application.CutCopyMode = 0
End Sub

[/vba]

Только CutCopyMode убирает рамку, но оставляет выделение диапазона. Пока не догуглил, как просто убрать выделение, без выбора какой-то левой другой ячейки.

Сообщение отредактировал w00tЧетверг, 26.05.2016, 23:05

 

Ответить

Serge_007

Дата: Четверг, 26.05.2016, 23:06 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 16326


Репутация:

2723

±

Замечаний:
±


Excel 2016

как просто убрать выделение, без выбора какой-то левой другой ячейки

А никак
Какая-то ячейка всегда должна быть активной
А значит выделение (фокус) будет переведено на активную ячейку, иначе никак…


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

w00t

Дата: Четверг, 26.05.2016, 23:11 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 131


Репутация:

3

±

Замечаний:
0% ±


Вроде выкрутился

[vba]

Код

Sub tt()
    Application.ScreenUpdating = 0
    r11_ = Sheets(«Лист2»).Range(«A» & Rows.Count).End(3).Row
    r1_ = Range(«C» & Rows.Count).End(3).Row
    r0_ = 5
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).FormulaR1C1 = _
        «=IFERROR(VLOOKUP(RC[-5],Лист2!R2C[-7]:R» & r11_ & «C[-5],3,0),»»-«»)»
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).Value = Range(«H» & r0_).Resize(r1_ — r0_ + 1).Value
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).Copy Range(«H» & r0_).Resize(r1_ — r0_ + 1): Application.CutCopyMode = False
    ‘Range(«H» & r0_).Resize(r1_ — r0_ + 1).PasteSpecial (xlPasteValues)
End Sub

[/vba]

 

Ответить

_Boroda_

Дата: Четверг, 26.05.2016, 23:26 |
Сообщение № 8

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16620


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS


Как-то Вы странно выкрутились.
1. [vba][/vba]дольше, чем
[vba]

Код

Range.Copy
Range.PasteSpecial (xlPasteValues)

[/vba]А Вы вроде писали, что делаете такой финт именно для повышения скорости

2. Зачем тогда строка
[vba]

Код

Range(«H» & r0_).Resize(r1_ — r0_ + 1).Copy Range(«H» & r0_).Resize(r1_ — r0_ + 1): Application.CutCopyMode = False

[/vba]

Если выделение мешает, то можно возвратить обратно то выделение, которое было до запуска макроса
[vba]

Код

Sub tt()
    Application.ScreenUpdating = 0
    ad_ = Selection.Address
    r11_ = Sheets(«Лист2»).Range(«A» & Rows.Count).End(3).Row
    r1_ = Range(«C» & Rows.Count).End(3).Row
    r0_ = 5
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).FormulaR1C1 = _
        «=IFERROR(VLOOKUP(RC[-5],Лист2!R2C[-7]:R» & r11_ & «C[-5],3,0),»»-«»)»
‘    Range(«H» & r0_).Resize(r1_ — r0_ + 1).Value = Range(«H» & r0_).Resize(r1_ — r0_ + 1).Value
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).Copy
    Range(«H» & r0_).Resize(r1_ — r0_ + 1).PasteSpecial (xlPasteValues)
    Application.CutCopyMode = 0
    Range(ad_).Select
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

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

Daniel_James

  • Гость
  • Записан

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

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



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

  • Administrator
  • Сообщения: 2 315
  • Записан

Ошибка вот здесь:
    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



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

  • Administrator
  • Сообщения: 2 315
  • Записан

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

  • свойство «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

  • Гость
  • Записан

  • Форум по VBA, Excel и Word

  • VBA, Excel

  • VBA, макросы в Excel

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

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Невозможно показать папку ошибка регистрации ole
  • Невозможно показать мозаику подбора площадей арматуры ошибка лира
  • Невозможно подключиться к принтеру ошибка 0x00004005
  • Невозможно подключиться к принтеру ошибка 0x00000709
  • Невозможно подключиться к принтеру ошибка 0x0000000a

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: