Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

VBA Excel - не найду ошибку в простейшей программе!

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Получайник
Гость





СообщениеДобавлено: Ср Авг 25 2004 19:40    Заголовок сообщения: VBA Excel - не найду ошибку в простейшей программе! Ответить с цитатой

Пытался написать пользовательскую функцию для MS Excel. Взял почти учебный пример из сети (заменил лишь названия листа). Функция вместо 'ok' выдает ошибку #ЗНАЧ!.

1| Function check()
2| If ActiveSheet.Cells(1, 1).Value = 1 Then
3| check = "position checked"
4| Else
5| ActiveSheet.Cells(1, 1).Value = 5
6| check = "misplaced"
7| End If
8| End Function

Причем, если пятую строчку сделать комментарием, то все работает. Что в ней может быть не так, ума не приложу. Буду очень благодарен, если мне кто-нибудь поможет. Спасибо.
Вернуться к началу
Гость






СообщениеДобавлено: Ср Авг 25 2004 23:10    Заголовок сообщения: Ответить с цитатой

Слушай может скажешь где брал учебный прмиер.
И вообще какие ссылки знаешь по доке VBA?
Вернуться к началу
Получайник
Гость





СообщениеДобавлено: Чт Авг 26 2004 20:53    Заголовок сообщения: Ответить с цитатой

Пример брал на каком-то сайте. Точно не помню адрес - там больше ничего не было. Ссылками я тоже не богат. Все, что есть:
1. http://www.dicks-blog.com/ - сайт только по Excel'ю, как я понял.
2. http://www.firststeps.ru/vba/excel/ - VBA для начинающих, тоже ориентирован на Excel, хотя очень толковый, мне понравился.
3. http://www.vertex42.com - тоже по Excel'ю.

Извиняй, что все ссылки узконапраленные - я их искал для решения конкретной проблемы. А до того я бейсиком не интересовался, так что ничего не накопилось.
Удачи.
Вернуться к началу
wildwind



Зарегистрирован: 03.02.2004
Сообщения: 268
Откуда: Москва

СообщениеДобавлено: Чт Авг 26 2004 20:55    Заголовок сообщения: Ответить с цитатой

Странно. Вроде работает (Excel 2000). А где должно выдаваться "ok"?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Гость






СообщениеДобавлено: Пт Авг 27 2004 09:05    Заголовок сообщения: Re: VBA Excel - не найду ошибку в простейшей программе! Ответить с цитатой

Получайник писал(а):
Пытался написать пользовательскую функцию для MS Excel. Взял почти учебный пример из сети (заменил лишь названия листа). Функция вместо 'ok' выдает ошибку #ЗНАЧ!.

2| If ActiveSheet.Cells(1, 1).Value = 1 Then

Причем, если пятую строчку сделать комментарием, то все работает. Что в ней может быть не так, ума не приложу. Буду очень благодарен, если мне кто-нибудь поможет. Спасибо.


Единственное, что тут может вызвать ошибку- ActiveSheet, укажи явно название листа.
Вернуться к началу
Получайник
Гость





СообщениеДобавлено: Пт Авг 27 2004 19:13    Заголовок сообщения: Ответить с цитатой

Мне тут сказали, что якобы пользовательские функции не могут менять содержание таблицы. Поверить не могу. Печально, если это не ошибка.

wildwind
'ok' должно выдаваться в ячейке, где прописывается функция, а вот '5' должна появляться в "посторонней" ячейке.

Гость
Насчет ActiveSheet, пробовал прописывать название листа - то же самое.
Вернуться к началу
wildwind



Зарегистрирован: 03.02.2004
Сообщения: 268
Откуда: Москва

СообщениеДобавлено: Пт Авг 27 2004 20:38    Заголовок сообщения: Ответить с цитатой

Подозреваю, что дело в том, что из функции нельзя менять данные на листе. Это раз. Потом, так как в ячейке стоит "=check()", то Excel не видит зависимости функции от данных в A1 и не вызывает функцию при вводе новых данных. Поэтому функция должна проверять значение не ячейки, а переданного ей аргумента. Если сделать так:
Код:
Function check(value)
 If value = 1 Then
   check = "position checked"
 Else
   check = "misplaced"
 End If
End Function

И в ячейке написать "=check(A1)", то все работает прекрасно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Борис
Гость





СообщениеДобавлено: Сб Авг 28 2004 14:09    Заголовок сообщения: В программе всё нормально в предположении... Ответить с цитатой

Кто виноват?
В программе всё нормально в предположении, что в соответствующей ячейке (ActiveSheet.Cells(1,1)) действительно стоит число, а не строка. Бывает, что в ячейку вставят "1 " (единицу с пробелом), что похоже на просто 1, соответственно сравнение с числом не проходит.

Что делать?
Используя дебаггер, найти, в какой строке возникает ошибка. Вероятней всего, она в строке if... То есть ошибочна не строка, а предположение, что в ячейке строго число один. Для исправления можно вместо сравнения с единицей использовать универсальную функцию преобразования любого типа в число (найти в хелпе).

PS Получил положительный заряд, когда смеялся над тем, что "функции нельзя менять данные на листе". Если бы это было так, тогда зачем вообще VBA?
[/b]
Вернуться к началу
Борис
Гость





СообщениеДобавлено: Сб Авг 28 2004 14:25    Заголовок сообщения: продолжение Ответить с цитатой

В данном же конкретном случае ошибка может возникать, если на листе ставится формула =check(), так как она изменяет *саму* *проверяемую* *ячейку*, то есть происходит зацикливание (если же просто прогнать функцию в тестовом проходе, то есть однократно, то она отработает нормально). Для исправления можно вместо 5| ActiveSheet.Cells(1, 1).Value = 5 написать, например, 5| ActiveSheet.Cells(1, 2).Value = 5
Вернуться к началу
wildwind



Зарегистрирован: 03.02.2004
Сообщения: 268
Откуда: Москва

СообщениеДобавлено: Пн Авг 30 2004 17:06    Заголовок сообщения: Ответить с цитатой

Борис
Ты бы хоть потрудился проверить, прежде чем смеяться. А еще лучше нашел бы точную причину ошибки, а не просто "из общих соображений". Человеку нужна конкретная помощь. А рассуждать мы все умеем.

Что может быть некорректного в том, что функция проверяет ячейку, а потом изменяет ее? Какие нафиг зацикливания, если явной зависимости нет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Борис
Гость





СообщениеДобавлено: Пн Сен 06 2004 10:15    Заголовок сообщения: Ответить с цитатой

wildwind писал(а):
Борис
Ты бы хоть потрудился проверить, прежде чем смеяться. А еще лучше нашел бы точную причину ошибки, а не просто "из общих соображений". Человеку нужна конкретная помощь. А рассуждать мы все умеем.

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

wildwind писал(а):
Что может быть некорректного в том, что функция проверяет ячейку, а потом изменяет ее? Какие нафиг зацикливания, если явной зависимости нет.

Зацикливание может произойти в том случае, если настройки эксела вызывают функцию неоднократно, то есть и до, и после изменения значения ячейки.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...