функция ВПР

Программирование на Visual Basic for Applications
batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

функция ВПР

Сообщение batiq » 15.07.2005 (Пт) 16:29

подскажите аналог вункции ВПР в VBA..

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 15.07.2005 (Пт) 16:38

For each i in Range(...)
if i.Value=search_string Then ...
Next i

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.07.2005 (Сб) 3:50

application.worksheetfunction.vlookup


На будущее.
Найди в папке с Офисом файл funcs.xls. Открой. И вопросы твои исчезнут.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 18.07.2005 (Пн) 10:24

GSerg писал(а):application.worksheetfunction.vlookup

А как ею пользоваться (у меня help по нему не открывется)?.
GSerg писал(а):На будущее.
Найди в папке с Офисом файл funcs.xls. Открой. И вопросы твои исчезнут.

при открытии появляется сообщение: дважды щелкнуть по ячейке для справки, но открывается справка без содержания (пустая)..

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 18.07.2005 (Пн) 10:37

uhm писал(а):For each i in Range(...)
if i.Value=search_string Then ...
Next i

i - типа range?.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 18.07.2005 (Пн) 10:38

vlookup - это и есть ВПР. Т. е. ты с помощью application.worksheetfunction можешь вызывать некоторые функции, которые ты вводишь в ячейки Эксель.

Кстати, GSerg, так не честно - спрашивали-то про аналог функции ВПР, а ты дал саму функцию... :D

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 18.07.2005 (Пн) 10:42

Да, i - типа Range. Только учти, здесь описан самый-самый общий принцип работы - ты пробегаешь циклом по столбцу, ищешь значение, которое совпадает с образцом, если найдешь - можешь делать что угодно. Такая вещь позволяет делать больше вещей, чем vlookup, но, может быть, работает медленнее (не проверял, впрочем).

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 18.07.2005 (Пн) 10:55

uhm писал(а):Да, i - типа Range. Только учти, здесь описан самый-самый общий принцип работы - ты пробегаешь циклом по столбцу, ищешь значение, которое совпадает с образцом, если найдешь - можешь делать что угодно. Такая вещь позволяет делать больше вещей, чем vlookup, но, может быть, работает медленнее (не проверял, впрочем).

а как задать деапазон ячеек в листе другой книги?.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 18.07.2005 (Пн) 11:04

Ну, что-нибудь типа

With Workbooks("название").Worksheets("название")...
или
With Workbooks(номер).Worksheets(номер)...

а дальше для обращения используешь .Range(...)

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 18.07.2005 (Пн) 11:21

uhm писал(а):With Workbooks(номер).Worksheets(номер)..

а как указывают номер, для чего он от куда берется?.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 18.07.2005 (Пн) 11:46

uhm писал(а):Да, i - типа Range. Только учти, здесь описан самый-самый общий принцип работы - ты пробегаешь циклом по столбцу, ищешь значение, которое совпадает с образцом, если найдешь - можешь делать что угодно. Такая вещь позволяет делать больше вещей, чем vlookup, но, может быть, работает медленнее (не проверял, впрочем).

как описать i?. у меня ошибка: i=nothing..

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.07.2005 (Пн) 12:11

Чел, юзай vlookup, а? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 18.07.2005 (Пн) 12:12

Dim i As Range
For Each i In Range("A1:B2")
...
Next i


С книгами и листами проще работать по имени, а не по номеру. Номер - это просто порядковый номер данной конкретной книги или листа, он не будет постоянным от запуска к запуску.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 18.07.2005 (Пн) 12:51

uhm писал(а):Dim i As Range
For Each i In Range("A1:B2")
...
Next i
Так я и сделал, но только вместо Range сделал:
Workbooks("SiteBase.xls").Worksheets(SheetsName).Range("A:A"). Так нельзя?.

uhm писал(а):С книгами и листами проще работать по имени, а не по номеру. Номер - это просто порядковый номер данной конкретной книги или листа, он не будет постоянным от запуска к запуску.

А откуда берется этот номер его както объявляют?.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 19.07.2005 (Вт) 15:20

uhm писал(а):Кстати, GSerg, так не честно - спрашивали-то про аналог функции ВПР, а ты дал саму функцию... :D

Ты конечно прав, но GSerg повел себя по дружески.. :P

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 19.07.2005 (Вт) 15:21

batiq писал(а):
uhm писал(а):Dim i As Range
For Each i In Range("A1:B2")
...
Next i
Так я и сделал, но только вместо Range сделал:
Workbooks("SiteBase.xls").Worksheets(SheetsName).Range("A:A"). Так нельзя?.

Или может следует указать путь к книге?.

uhm писал(а):С книгами и листами проще работать по имени, а не по номеру. Номер - это просто порядковый номер данной конкретной книги или листа, он не будет постоянным от запуска к запуску.

А откуда берется этот номер его както объявляют?.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 19.07.2005 (Вт) 15:25

Шучу я, шучу.

Номер, насколько я понимаю, присваевается по порядку, т. е., открыл ты одну книгу Эксель - будет она у тебя номер 1, открыл следующую - номер 2, и т. д. Поэтому, если не нужно пробегать все книги или листы в цикле, проще пользоваться именами, а не номерами.

Workbooks("SiteBase.xls").Worksheets(SheetsName).Range("A:A") - можно так писать. Проверь, что у тебя SheetsName нормальный.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 19.07.2005 (Вт) 15:27

А! О! Забыл... Книга-то у тебя эта (SiteBase.xls) открыта?

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 19.07.2005 (Вт) 16:42

uhm писал(а):А! О! Забыл... Книга-то у тебя эта (SiteBase.xls) открыта?

Книга закрыта..
может быть, что дело в том, что сравнивается
Range и Workbooks.Worksheets.Range :?:

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 19.07.2005 (Вт) 17:07

Не-е, дело именно в том, что книга закрыта. :)
Проще всего будет сделать в начале макроса Workbooks.Open, а в конце, если та книга не нужна, ее закрыть с помощью Workbook("SiteBase").Close

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 21.07.2005 (Чт) 16:16

uhm писал(а):Не-е, дело именно в том, что книга закрыта. :)
Проще всего будет сделать в начале макроса Workbooks.Open, а в конце, если та книга не нужна, ее закрыть с помощью Workbook("SiteBase").Close
не получается..

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 22.07.2005 (Пт) 10:05

Жаль :twisted:

Написал бы хоть, что и как не получается... :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.07.2005 (Пт) 10:24

А Workbook("SiteBase.xls").Close ?
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 22.07.2005 (Пт) 14:54

Следующая процедура работает очень долго; мне необходимо искать первые попавшиеся значения:
Код: Выделить всё
For Each icell In Workbooks("sitebase.xls").Worksheets(BSCName).Range("A:A")
If icell.Value = Range("B" + CStr(i)).Cells Then Range("C" + CStr(i)).Cells = Workbooks("sitebase.xls").Worksheets(BSCName).Range("B" + CStr(icell.Row)).Cells
Next icell

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 22.07.2005 (Пт) 14:59

uhm писал(а):Жаль :twisted: Написал бы хоть, что и как не получается... :)

не получалось открыть файл.. решил так
Код: Выделить всё
Workbooks.Open Filename:=ThisWorkbook.Path + "\SiteBase.xls"

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 22.07.2005 (Пт) 16:22

для меня все - достижение!. я новичек в бейсике..

подскажите как использовать vlookup (не могу найти по ней документацию)

надо присвоить ячейке результат функции ВПР()

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

vlookup

Сообщение batiq » 25.07.2005 (Пн) 11:34

batiq писал(а):для меня все - достижение!. я новичек в бейсике..

подскажите как использовать vlookup (не могу найти по ней документацию)

надо присвоить ячейке результат функции ВПР()

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.07.2005 (Пн) 11:52

А не проще записать в ячейку саму функцию ВПР?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 25.07.2005 (Пн) 12:09

GSerg писал(а):А не проще записать в ячейку саму функцию ВПР?

таблица генерируется с чистого листа.. и необходимо добавить вычисляемый столбец..

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.07.2005 (Пн) 12:19

Ну так проблема в чём?

Код: Выделить всё
with worksheets.add
  .cells(1,5).formula = "= vlookup(A1, B1:C100, 2, FALSE())"
end with


Либо, если надо чтобы работало только в русскоязычной версии Excel:
Код: Выделить всё
with worksheets.add
  .cells(1,5).formulalocal = "= ВПР(A1; B1:C100; 2; ЛОЖЬ())"
end with



Если бы ты сразу сказал, что надо добавить вычисляемый столбец, ты сразу получил бы этот ответ.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList