Гость
Map
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как используя VBA можно передать в переменную значение, полученное от VLOOKUP? / 14 сообщений из 14, страница 1 из 1
09.06.2021, 22:42
    #40076764
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Здравствуйте,
Подскажите, как используя VBA можно передать в переменную значение, полученное например от функции ВПР... ?

Можно записать значение от функции ВПР в ячейку, как в п.1, но в ячейке отражается конечно и формула ВПР...
1) Cells(5, 5).Formula = "=VLOOKUP($D7,'C:\[Bill.xlsx]Phone'!$A$2:$D$60,4,0)"

Попытался записать в переменную, используя п.2, но в переменную также переносится и формула расчета.
2) Rezult = ["=VLOOKUP($D7,'C:\[bill.xlsx]Phone'!$A$2:$D$60,4,0)"]

Что и видно, когда используешь п.3
3) Cells(5, 10).Value = Rezult

А вот попробовал еще использовать WorksheetFunction.VLOOKUP, но не могу с синтаксисом разобраться.
4) Rezult = WorksheetFunction.VLOOKUP($D7,’C:\[bill.xlsx]Phone'!$A$2:$D$60,4,0) не работает

Кто поможет разобраться , как передать через VBA значение ВПР в переменную Rezult ?
И что неправильно с синтаксисом в п.4 ?

Спасибо!
...
Рейтинг: 0 / 0
10.06.2021, 09:24
    #40076790
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Yuri KR
не могу с синтаксисом разобраться
потому что использовать надо синтаксис VBA, а не формул листа:
Код: vbnet
1.
Rezult = WorksheetFunction.VLOOKUP(Range("D7"),Workbooks("bill.xlsx").Sheets("Phone").Range("A2:D60"),4,0)
...
Рейтинг: 0 / 0
10.06.2021, 09:59
    #40076794
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
The_Prist, Добрый день! Да Вы правы.
Сейчас все работает правильно,
Спасибо большое!
Всем хорошего дня!
...
Рейтинг: 0 / 0
21.06.2021, 12:30
    #40079115
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
The_Prist, добрый день!
Подскажите пожалуйста, как можно в VBA использовать переменные в функции Range ?

Например, выражение 1 работает корректно. 1). Range(Cells(1, 10), Cells(1, 10)).Value = 300
Вместо Cell (1,10) хотел бы использовать Cell (I,K) ....

Пытаюсь по аналогии заменить Range("$A2:$D$61") на Range(Cells(2, 1), Cells(61, 4)) - вылетает ошибка 1004

Применяю совместно с LOOKUP. Выражение 2 работает корректно, выражение 3 с ошибкой 1004.

2). Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), Workbooks("bill.xlsx").Sheets("Phone").Range("$A2:$D$61"), 4, 0)

3). Rezult3 = WorksheetFunction.VLookup(Range(Cells(7, 4), Cells(7, 4)), Workbooks("bill.xlsx").Sheets("Phone").Range(Cells(2, 1), Cells(61, 4)), 4, 0)

При этом доступ к файлу и листу есть.
Workbooks.Open "D:\Test\Bill.xlsx"
ActiveSheet.Name = "Phone"

Может есть какие идеи?
Спасибо!
...
Рейтинг: 0 / 0
21.06.2021, 13:12
    #40079128
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Yuri KR
выражение 3 с ошибкой 1004.
Отож... Cells(2, 1), Cells(61, 4) берутся с активного листа, а не с Workbooks("bill.xlsx").Sheets("Phone") .

Код: vbnet
1.
2.
3.
Set ah = ActiveSheet
Set sh = Workbooks("bill.xlsx").Sheets("Phone")
Rezult3 = WorksheetFunction.VLookup(Range(ah.Cells(7, 4), ah.Cells(7, 4)), sh.Range(sh.Cells(2, 1), sh.Cells(61, 4)), 4, 0)
...
Рейтинг: 0 / 0
21.06.2021, 15:10
    #40079161
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Akina, попробовал, вы все логично написали, но выдает ту же 1004 ошибку, скрин прилагаю в файле.

может дело в том, что в Lookup работает с двумя листами, которые не находятся в одной книге?
...
Рейтинг: 0 / 0
21.06.2021, 18:35
    #40079209
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Yuri KR
может дело в том, что в Lookup работает с двумя листами, которые не находятся в одной книге?
Тогда все адрес должны быть полными и включать и имя книги, и имя листа.
...
Рейтинг: 0 / 0
22.06.2021, 09:16
    #40079270
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Akina, доброе утро! да все логично, спасибо, в целом подход понятен и основная часть работает.
...
Рейтинг: 0 / 0
24.06.2021, 12:52
    #40079809
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Добрый день! В продолжении темы, появился вопрос с обработкой ошибки, когда VLookup не находит данные.
Не могу перехватить ошибку, если используется WorksheetFunction.VLookup
Не получается использовать:
Код: vbnet
1.
2.
  On Error Resume Next  
  Rezult_Logic = IsError(WorksheetFunction.VLookup(Range(ah.Cells(L, H1), ah.Cells(L, H1)), sh.Range(sh.Cells(N1, P1), sh.Cells(N2, P2)), H, 0))  



Rezult_Logic всегда False, даже на строках, где данные не найдены.

Если используется Application.VLookup - ошибка перехватывается.
Тогда строчка выглядит ка книже и все работает.
Код: vbnet
1.
2.
On Error Resume Next  
Rezult3 = Application.VLookup(Range(ah.Cells(L, H1), ah.Cells(L, H1)), sh.Range(sh.Cells(N1, P1), sh.Cells(N2, P2)), H, 0)



Но хотелось бы использовать, если надо и функционал WorksheetFunction.VLookup и научиться перехватывать такие ошибки.
Кто поможет? Спасибо!
...
Рейтинг: 0 / 0
24.06.2021, 13:02
    #40079814
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Yuri KR,

Код: vbnet
1.
2.
3.
4.
5.
 On Error Resume Next
 Debug.Print Application.WorksheetFunction.VLookup(1, Range("A1:A5"), 1, False)
 If Err Then
    MsgBox "Error"
 End If
...
Рейтинг: 0 / 0
24.06.2021, 16:21
    #40079889
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
big-duke,
спасибо! проверил, работает.
только если в цикле выполнять, то все корректно отрабатывает до первой ошибки, далее ошибка перехватывается и обрабатывается, а потом странность - ошибка не сбрасывается и выражение всегда становится ошибочным, хотя данные точно есть.
Почему?

For i=1 to 100
On Error Resume Next
Debug.Print Application.WorksheetFunction.VLookup(Range(ah.Cells(L, H1), ah.Cells(L, H1)), sh.Range(sh.Cells(N1, P1), sh.Cells(N2,
P2)), H, 0)
If Err Then
MsgBox "Error"
End If
On Error GOTO 0
Next I


Вышел из положения тем, что включил в тело цикла - On Error Resume Next и в конце цикла добавил On Error GOTO 0 для сброса контроля ошибок, но это "костыль".
...
Рейтинг: 0 / 0
25.06.2021, 10:06
    #40080036
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
Yuri KR
Почему?
Вы не сбрасываете значение ошибки, а надо бы, чтобы она не висела до новой ошибки или до конца кода:
Код: vbnet
1.
2.
3.
4.
If Err Then
MsgBox "Error"
err.clear 'сбрасываем ошибку
End If
...
Рейтинг: 0 / 0
25.06.2021, 10:08
    #40080037
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
The_Prist
Yuri KR
Почему?
Вы не сбрасываете значение ошибки, а надо бы, чтобы она не висела до новой ошибки или до конца кода:
Код: vbnet
1.
2.
3.
4.
If Err Then
MsgBox "Error"
err.clear 'сбрасываем ошибку
End If


Кстати, если записать так:
Код: vbnet
1.
2.
Debug.Print Application.VLookup(Range(ah.Cells(L, H1), ah.Cells(L, H1)), sh.Range(sh.Cells(N1, P1), sh.Cells(N2,
P2)), H, 0)


то сообщение об ошибке появляется не будет, но ошибка будет генерироваться. Полезно, если не хочется использовать On Error Resume Next.
...
Рейтинг: 0 / 0
25.06.2021, 11:14
    #40080064
Yuri KR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как используя VBA можно передать в переменную значение, полученное от VLOOKUP?
The_Prist, спасибо, со сбросом ошибки все заработало как надо!

Вообще получается, что использование VLookup для имеет свои нюансы, если нет данных...
хочу попробовать использовать Range.Find, или INDEX с MATCH.
Но там скорее всего выплывут свои нюансы :)
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как используя VBA можно передать в переменную значение, полученное от VLOOKUP? / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]