Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2009, 22:44   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Написать в VBA аналог формулы екселя.

Задача: есть таблица значений "Смежники.таблица", в которой 5 столбцов. Есть переменная в которой есть значение из первого столбца. Нужно получить значение любого столбца из строки в которой находиться значение.

В экселе решаю задачу так:
"=IF(ISNA(VLOOKUP(I9,Смежники.табли ца,2,FALSE)),"111",VLOOKUP(I9,Смежн ики.таблица,5,FALSE))"

В VBA написал так:
WorksheetFunction.IF(WorksheetFunct ion.IsNA(WorksheetFunction.VLookup( смежники(n, i), "смежники.таблица", 2, False)), "111", WorksheetFunction.VLookup(смежники( n, i), "смежники.таблица", 5, False))

Вместо ячейки "I9" значения нужно брать из массива "смежники".

При попытке выполнить вылетает матерная фраза "Невозможно получить свойство VLookup класса WorksheetFunction". Хотя основную часть я "подсмотрел" у самого экселя.

Как быть? Куда рыть?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.04.2009, 22:54   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А что это такое - смежники(n, i)?

Скорее всего эта функция возвращает значение не того типа, которое требуется функции VLookup в качестве параметра.

Или попробуйте заменить "смежники.таблица" на [смежники.таблица]

Последний раз редактировалось EducatedFool; 12.04.2009 в 22:59.
EducatedFool вне форума Ответить с цитированием
Старый 12.04.2009, 23:06   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А что это такое - смежники(n, i)?

Скорее всего эта функция возвращает значение не того типа, которое требуется функции VLookup в качестве параметра.
Двухмерный массив. Содержит имена смежников, информация полностью аналогична той что содержится в ячейки "I9"
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Или попробуйте заменить "смежники.таблица" на [смежники.таблица]
Сейчас попробую....
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.04.2009, 23:10   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Или попробуйте заменить "смежники.таблица" на [смежники.таблица]
Не помогло... Попробовал перенести значение из массива в переменную и подставить ее. То же мимо... (
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.04.2009, 23:20   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот в таком виде функция VLookup работает правильно: (проверял)

Код:
Sub test()
    res = WorksheetFunction.VLookup(5, [смежники.таблица], 2, False)
    MsgBox res
End Sub

Цитата:
Не помогло...
В любом случае, вместо "смежники.таблица" надо писать [смежники.таблица]
(поскольку Вы передаёте функции не имя диапазона, а сам диапазон)

И попробуйте вычислить формулу по частям - в VBA совсем не обязательно писать всё в одну строчку...
Сразу увидите, в чём ошибка.

Попробуйте так:
Код:
Sub test()
    On Error Resume Next: Err.Clear
    res = WorksheetFunction.VLookup(смежники(n, i), [смежники.таблица], 2, False)
    If Err.Number > 0 Then res = "111" Else res = WorksheetFunction.VLookup(смежники(n, i), [смежники.таблица], 5, False)
    MsgBox res
End Sub
Цитата:
У меня не работает, стой же ошибкой. (((
Ошибка и будет появляться, если в первом столбце именованного диапазона [смежники.таблица] отсутствует ячейка со значением "5"
Поставьте в строку res = WorksheetFunction.VLookup(5, [смежники.таблица], 2, False)
вместо пятёрки какое-нибудь значение, которое точно присутствует в таблице, и проверьте макрос.

А вообще, зачем проверять на ошибку результат функции WorksheetFunction.VLookup(смежники( n, i), [смежники.таблица], 2, False),
если точно такой же результат выдаст WorksheetFunction.VLookup(смежники( n, i), [смежники.таблица], 5, False)?

Код в этом случае упрощается:
Код:
Sub test()
    On Error Resume Next: Err.Clear
    res = WorksheetFunction.VLookup(смежники(n, i), [смежники.таблица], 5, False)
    res = IIf(Err.Number > 0, "111", res)
    MsgBox res
End Sub

Последний раз редактировалось EducatedFool; 12.04.2009 в 23:41.
EducatedFool вне форума Ответить с цитированием
Старый 12.04.2009, 23:28   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вот в таком виде функция VLookup работает правильно: (проверял)

Код:
Sub test()
    res = WorksheetFunction.VLookup(5, [смежники.таблица], 2, False)
    MsgBox res
End Sub
В любом случае, вместо "смежники.таблица" надо писать [смежники.таблица]
(поскольку Вы передаёте функции не имя диапазона, а сам диапазон)
И попробуйте вычислить формулу по частям - в VBA совсем не обязательно писать всё в одну строчку...
Сразу увидите, в чём ошибка.
Чертовщина.... У меня не работает, стой же ошибкой. :((((
Попробую перегрузиться....
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.04.2009, 23:47   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код в этом случае упрощается:
Код:
Sub test()
    On Error Resume Next: Err.Clear
    res = WorksheetFunction.VLookup(смежники(n, i), [смежники.таблица], 5, False)
    res = IIf(Err.Number > 0, "111", res)
    MsgBox res
End Sub
Спасибо! Заработало. :) Может перезагрузка все же помогла. :))))
Теперь поколдуем....

Можно немного подробнее что делает эта строчка?
Код:
    On Error Resume Next: Err.Clear
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 13.04.2009, 00:00   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

On Error Resume Next - говорит Excel-ю, что в случае ошибки идём дальше
(короче, сообщения об ошибках выводиться не будут)

Объект Err хранит все параметры произошедшей ошибки (номер, описание, и т.п.)
Err.Clear - мы очищаем этот объект (сбрасываем параметры последней ошибки)

Потом мы вычисляем функцию WorksheetFunction.VLookup, которая может сгенерировать ошибку

Чтобы узнать, произошла ли ошибка, мы проверяем номер ошибки у объекта Err
Если ошибка имела место, то номер ошибки будет ненулевой.

PS: Всё это можно было прочитать в справке (или же спросить у Гугла)
EducatedFool вне форума Ответить с цитированием
Старый 13.04.2009, 00:08   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
On Error Resume Next - говорит Excel-ю, что в случае ошибки идём дальше
(короче, сообщения об ошибках выводиться не будут)

Объект Err хранит все параметры произошедшей ошибки (номер, описание, и т.п.)
Err.Clear - мы очищаем этот объект (сбрасываем параметры последней ошибки)

Потом мы вычисляем функцию WorksheetFunction.VLookup, которая может сгенерировать ошибку

Чтобы узнать, произошла ли ошибка, мы проверяем номер ошибки у объекта Err
Если ошибка имела место, то номер ошибки будет ненулевой.

PS: Всё это можно было прочитать в справке (или же спросить у Гугла)
Понятно. Спасибо!
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глюк Excel-2007??? Формулы в ячейку из VBA Rafik Microsoft Office Excel 7 24.03.2009 13:59
Возможно ли написать в VB/VBA(Ex) софтину, которая бы управляла программой (или usb устройством) RussellMur Microsoft Office Excel 14 09.03.2009 03:25
как написать на vba стандарные функции excel ibrahimov Microsoft Office Excel 4 28.11.2008 04:42
Аналог with на С++. Иллидан Общие вопросы C/C++ 1 16.05.2008 21:41
Как конвертировать из екселя записи в текстовый файл? Askat Общие вопросы Delphi 6 02.07.2007 08:15