Доброй ночи. |
|
а где приложенный файл с примером? P.S. 1004 — своеобразная ошибка и скорее всего она не относится к коду никак (т.е. код правильный и причина в чём-то другом) |
|
У вас, скорее всего, ячейка пустая тут Cells(i, 2).Value |
|
Я попробовал ваш код (со своими переменными), всё нормально работает. Но если ячейка по адресу Cells(i, 2).Value пустая, то выскакивает ошибка 1004 |
|
приложил файл, всё равно не работает независимо от того, пустая ли ячейка, или нет Sub asdf() Do While i <> 6 End Sub |
|
«невозможно получить свойство vlookup класса worksheetfunction» — такая ошибка |
|
Заработал код ниже: ошибки нашёл, вроде понял. Если только небольшой ликбез кто-то сможет устроить. Чем отличается Application.VLookup от Application.WorksheetFunction.VLookup. Что за принцип? Sub asdf() Do While i <> 7 f = f + 1 Loop End Sub |
|
Если честно, то я не понимаю, что вы хотите. Может вы сами запутались в своих переменных и циклах? Смотрите приложенный файл. Там рабочий код. Никаких ошибок не выскакивает. Sub asdf() For i = 1 To 6 |
|
и в ВПР для поиска точного соответствия лучше использовать в 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?
asked Oct 9, 2013 at 19:05
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
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 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
Простой ВПР двух таблиц макросом |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Автор 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